草庐IT

ASP.NET MVC : Save multiple values on autocomplete

coder 2023-10-11 原文

我有一个 mysql 数据库,其中包含表“deliverables”、“tags”和“deliverables_has_tags”。我想将标签链接到可交付成果。

这是我在 javascript 文件中所做的:

<script type="text/javascript" language="javascript">
    $(function () {
        var object = {};
        $.ajax({
            type: "GET",
            url: "/Deliverable/Tags",
            dataType: "json",
            success: function (data) {
                object.tags = data;
            }
        });

        function split(val) {
            return val.split(/,\s*/);
        }
        function extractLast(term) {
            return split(term).pop();
        }
        $("#tags")
        // don't navigate away from the field on tab when selecting an item
            .bind("keydown", function (event) {
                if (event.keyCode === $.ui.keyCode.TAB &&
                $(this).data("ui-autocomplete").menu.active) {
                    event.preventDefault();
                }
            })

.autocomplete({
    minLength: 0,
    source: function (request, response) {
        // delegate back to autocomplete, but extract the last term
        response($.ui.autocomplete.filter(
object.tags, extractLast(request.term)));
    },
    focus: function () {
        // prevent value inserted on focus
        return false;
    },
    select: function (event, ui) {
        var terms = split(this.value);
        // remove the current input
        terms.pop();
        // add the selected item
        terms.push(ui.item.value);
        // add placeholder to get the comma-and-space at the end
        terms.push("");
        this.value = terms.join(", ");

        return false;
    }
});
    });
</script>

我可以在文本框中添加多个标签。

但现在我想将其保存在我的存储库中。 在 Controller 中的 Action 方法中:

repository.AddDeliverable(model.Title, model.Description, model.UsernameID, data, datatwo, model.VideoUrl, model.AfstudeerrichtingID, model.ProjectID);

标签操作:

public JsonResult Tags()
{
    var data = (repository.GetTags()).ToArray();

    return Json(data, JsonRequestBehavior.AllowGet);
}

在我的仓库中:

public IQueryable<string> GetTags()
{
    return from tag in entities.tags
           orderby tag.tag_name
           select tag.tag_name;
}

我不知道如何将其保存在我的数据库中。
谁能帮帮我?

最佳答案

如果我正确理解了您的问题,那么您已经按如下方式实现了标签处理:

  1. 有一个 MVC 操作方法返回带有不包含数据的输入占位符的 View
  2. 占位符本身可能是 input type=text with id=tags
  3. 在“dom ready”时,您触发 ajax 请求以从数据库中检索您的标签,json 序列化为数组;当它到达时,你将它存储到 tags 变量(没有错误处理(!))
  4. 同时,您使用 jqueryui 自动完成功能装饰您的输入,该自动完成功能对用户输入作出 react 并从标签变量返回项目
  5. 由于输入已经包含标签(逗号分隔),您的过滤器是最后一个标签的第一个字母

所以,当用户输入了几个逗号分隔的标签(可能其中一些可能是新的)并且现在想将其保存到数据库时,您会遇到这种情况。对于每个输入,如果这是一个已知标签,则必须将其存储到“deliverables_has_tags”。如果有新标签,则必须将其同时存储到“tags”和“deliverables_has_tags”。

最常见的情况是使用“保存”按钮开始保存过程。 让我们分析一下您在此过程中必须执行的操作。

1) 按钮点击

On button click you use js to convert your comma separated tags string using logic like split(term) to the array, and serialize it. You can do serialization using serializeArray and manually create JSON object, or serialize the whole form using $('#yourForm').serialize(). I would choose the first option because that way I get more control over JSON format and avoid problems with MVC default model binder.

2) Ajax调用

When the JSON object is ready to be sent, you fire an ajax POST request to your MVC POST action method. When you save state always avoid GET because new versions of browsers can scan thru your page and actively preload urls using GET requests. You don't want this here. Of course, use your data as a data-parameter in the ajax call.

3) Action 方法

When the request arrives, you have to process it in your controller using a new action method. Typically in this case you will have something like public JsonResult SaveTags(SaveTagsModel saveTags) { ... } which saves tags using your repository and returns result that says something like 'OK' or 'ERROR' (sth like response.isSaved=true/false). Tricky part can be designing view model according to your JSON object - this could help. And regarding collections this could be valuable info.

When saving, use transaction to ensure everything is saved at once. First check if each tag exists in the database and insert those who don't exist. After that, check for each tag if there is appropriate n-n relation in deliverables_has_tags and insert it if there isn't. I believe that you should use same repository encapsulation for both operations.

关于ASP.NET MVC : Save multiple values on autocomplete,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16924024/

有关ASP.NET MVC : Save multiple values on autocomplete的更多相关文章

  1. ruby - 在 ASP 页面上 Mechanize 中断 - 2

    require'mechanize'agent=Mechanize.newlogin=agent.get('http://www.schoolnet.ch/DE/HomeDE.htm')agent.clicklogin.link_withtext:/Login/然后我得到Mechanize::UnsupportedSchemeError。 最佳答案 Mechanize不支持javascript但您可以将搜索字段添加到表单并为其分配搜索词并使用mechanize提交表单form=page.forms.firstform.add_fie

  2. asp.net - 在 Ruby 中重新实现 ASP.NET 成员资格和用户密码哈希 - 2

    我有一个大型用户数据库(约200,000个),我正在将其从ASP.NET应用程序转移到RubyonRails应用程序。我真的不想要求每个用户重置他们的密码,所以我试图在Ruby中重新实现C#密码哈希函数。旧函数是这样的:publicstringEncodePassword(stringpass,stringsaltBase64){byte[]bytes=Encoding.Unicode.GetBytes(pass);byte[]src=Convert.FromBase64String(saltBase64);byte[]dst=newbyte[src.Length+bytes.Leng

  3. asp.net - IronRuby 死了吗? - 2

    我是.Net程序员,希望扩展并可能在我当前和future的Web应用程序中使用一些Ruby。看着IronRubyWebsite最后一次发布是将近一年前:2011年3月13日。否announcements从那时起就已经在他们的网站上制作了。考虑到所有这些,我想到了几个问题:IronRuby死了吗?如果该项目已终止,是否有任何替代方案集成到.Net中?如果它还活着,它仍然是一个积极维护的项目吗?我在哪里可以找到最新版本?我是不是找错了树?我是否应该将ruby​​保留为ruby​​,将.Net保留为.Net,这两个独立的实体永远不会在同一个项目中相遇?我在stackoverflow上看到过有

  4. javascript - 如何将数据从 ASP.NET WebForms 传递到 Aurelia Global Scope - 2

    我正在从基于Web表单的遗留应用程序引导Aurelia。我的身份验证相关信息在自定义基页类的Web表单应用程序中维护。我如何将此身份验证信息传递和维护到Aurelia的全局范围?这样我就可以在使用路由构建菜单时使用它来根据用户/Angular色显示/隐藏某些菜单项? 最佳答案 您可以将逻辑添加到您的自定义基页中以添加标记到文档的头部,使所有信息都可用于javascript应用程序:...window.appInfo={user:'foo',bar:'baz'};...然后在您的aurelia应用中,您可以根据需要访问此信息:expo

  5. javascript - 为什么 ASP.NET 在 IE7 中导致 "Operation Aborted"错误? - 2

    我已经阅读了很多博客文章,其中提供了IE中“操作中止”错误的原因和解决方案。我最近构建了一个应用程序,有时会为某些用户出现此错误。让我详细解释一下。该应用程序是在VS2008中构建的.NET2.0、ASP.NET和C#Web应用程序。它使用ComponentOneWeb控件以及标准的VisualStudio控件。在其中一个网页中,我让用户在一组ComponentOneWeb输入控件中键入输入,然后将其添加到集合中。集合绑定(bind)到中继器,每次在集合中创建新条目时,中继器都会反弹。如果用户从转发器中删除条目(使用命令按钮),集合将更新并重新回到转发器。当应用程序提交给最终用户进行测

  6. ASP.NET - 使用 jQuery 处理基于 JSON 的 Web 服务的正确方法是什么? - 2

    将基于ASP.NETSOAP的Web服务转换为基于JSON的响应的正确方法是什么?...然后从jQuery中调用它们?集成基于jQuery的AJAX和ASP.NET时的“最佳实践”是什么?文章?书? 最佳答案 可以使用System.Runtime.Serialization和System.Runtime.Serialization.JSON将JSON转换为.NET类。我怀疑您对设置从客户端到服务器的函数调用更感兴趣。我觉得值得一试thistutorial.在本教程中,您需要添加一个网络服务“.asmx”文件。在asmx文件中,您将能

  7. asp.net - 开发不依赖于 JavaScript 的 ASP.NET 应用程序的技巧 - 2

    不确定这是否属于社区wiki...有人可以提供一些关于如何成功构建不依赖于JavaScript的ASP.NET站点的通用指南吗?我的理解是,我应该首先在没有JavaScript的情况下构建一个功能性网站,并用它来增强用户体验。说起来容易做起来难……除了禁用JavaScript并尝试它之外,我如何才能确保我的网站在没有JavaScript的情况下正常工作?或者这是经验带来的东西? 最佳答案 尝试ASP.NETMVC!当然,大多数示例都使用JavaScript来实现AJAX功能,但是构建一个不使用JavaScript的功能齐全的网站也很

  8. asp.net-mvc - 在 ASP.NET MVC 的局部 View 中执行 Javascript - 2

    我在head标签内使用这段JavaScript代码,以便用浏览按钮填充div,以便用户可以上传图像(swfupload)。...varswfu=function(){returnnewSWFUpload({//BackendSettings//settingsgohere...//Toolongtodisplayhere//DebugSettingsdebug:false});}window.onload=swfu;....这很好用,但问题是当我尝试将这段代码放在局部View中时。到目前为止,我还无法让它发挥作用。有没有更有经验的救援人员?谢谢 最佳答案

  9. c# - 如何确定包含在 Asp.net 页面中的重复 Javascript 函数 - 2

    我有一个使用一些javascript函数的应用程序,由于所有javascript都包含在Masterpage中,因此页面附带的大多数javascript不是必需的,并且其中一些是重复的(因为在一些不同的JS文件中使用。)所以我想检查是否有一种方法可以确定重复函数并将其删除? 最佳答案 你可以在声明一个函数的时候检查这个函数是否存在,但是你必须改变它的工作方式。代替functionfoo(){something}做if(window.foo===undefined){window.foo=function(){something}}你

  10. asp.net - Facebook Connect 登录按钮未呈现 - 2

    我正在尝试实现FacebookConnect单点登录网站。我最初只有一个连接按钮(),用户每次想要登录时都必须单击该按钮。我现在可以使用自动登录和注销功能。也就是说,我的站点将检测已登录的Facebook帐户,如果它可以找到与我站点的用户帐户之一匹配的帐户,则自动对其进行身份验证,如果Facebooksession丢失,则自动取消身份验证。我还有一个手动注销按钮,可以让用户退出我的网站和Facebook。所有这些都正常工作,但现在我原来的“连接”按钮间歇性地无法正确呈现。它只是显示为纯XHTML(即,它看起来像纯文本——而不是按钮——并且不可点击),并且没有应用XFBML。这是基本代码

随机推荐