ASP.NET MVC:在自动完成时保存多个值

ASP.NET MVC:在自动完成时保存多个值,asp.net,mysql,asp.net-mvc,many-to-many,Asp.net,Mysql,Asp.net Mvc,Many To Many,我有一个mysql数据库,其中有表“可交付成果”、“标记”和“可交付成果有标记”。我想将标签链接到可交付成果 这是我在javascript文件中执行的操作: <script type="text/javascript" language="javascript"> $(function () { var object = {}; $.ajax({ type: "GET", url: "/Deliv

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

这是我在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>
标签操作:

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;
}
public IQueryable GetTags()
{
从entities.tags中的标记返回
orderby tag.tag\u名称
选择tag.tag\u name;
}
我不知道如何将其保存到数据库中。

有人能帮我吗?

在post操作中,将FormCollection作为参数,并从中收集标记。没有自动的方法。您可以实现一些自定义模型绑定,但这可能不值得努力。

如果我正确理解了您的问题,您已经实现了标记处理,如下所示:

  • 有一个MVC操作方法返回输入占位符不包含数据的视图
  • 占位符本身可能是id=tags的
    input type=text
  • 在“dom就绪”时,您发出ajax请求,从数据库中检索标记,json序列化为数组;当它到达时,您将其存储到
    标签
    变量(无错误处理(!)
  • 同时,您可以使用jqueryui autocomplete来修饰您的输入,jqueryui autocomplete会对用户输入做出反应,并从tags变量返回项目
  • 因为输入已经包含标记(逗号分隔),所以过滤器是最后一个标记的第一个字母
  • 所以,当用户输入了几个逗号分隔的标记(其中一些可能是新的)并希望将其保存到数据库中时,就会出现这种情况。对于每个输入,如果这是一个已知的标记,则必须将其存储到“可交付成果\u has\u标记”中。如果有一个新的标签,您必须将其存储到“标签”和“交付物\u有\u标签”

    最常见的情况是使用“保存”按钮开始保存过程。 让我们分析一下在这个过程中你必须做什么

    1)按钮单击

    单击按钮,您可以使用js转换逗号分隔的标记字符串 使用类似于
    split(term)
    的逻辑对数组进行拆分,并将其序列化。你可以 使用并手动创建JSON进行序列化 对象,或使用 . 我会选择第一个选项 因为这样我可以更好地控制JSON格式并避免 MVC默认模型绑定器存在问题

    2)Ajax调用

    当JSON对象准备好发送时,触发 请求您的MVC POST操作方法。当您保存状态时,始终 避免GET,因为新版本的浏览器可以扫描您的页面并 使用GET请求主动预加载URL。你不想在这里。属于 当然,在ajax调用中使用数据作为数据参数

    3)行动方法

    当请求到达时,您必须在控制器中处理它 使用新的动作方法。通常在这种情况下,您将 类似于
    publicJSONResult SaveTags(SaveTagsModel SaveTags){
    …}
    它使用存储库保存标记并返回 说“OK”或“ERROR”之类的话 response.isSaved=true/false)。棘手的部分可能是设计视图模型 根据您的JSON对象-可能会有所帮助。关于 收藏可能是有价值的信息

    保存时,请使用事务以确保立即保存所有内容。 首先检查数据库中是否存在每个标记,并插入 不存在。之后,检查每个标签是否有合适的标签
    可交付成果中的n-n关系有标记,如果没有,则插入标记。
    我认为您应该对这两个应用程序使用相同的存储库封装
    行动


    有一种方法可以对
    serializeArray()
    'd集合进行建模绑定,请参阅
    public IQueryable<string> GetTags()
    {
        return from tag in entities.tags
               orderby tag.tag_name
               select tag.tag_name;
    }