4

我有一个 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>

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

但现在我想把它保存在我的存储库中。在控制器中的我的 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;
}

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

4

2 回答 2

2

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

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

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

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

1) 按钮点击

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

2)阿贾克斯调用

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

3) 动作方法

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

保存时,使用事务确保一次保存所有内容。首先检查每个标签是否存在于数据库中,并插入那些不存在的。之后,检查每个标签是否存在适当的 nn 关系,deliverables_has_tags如果没有则插入。我相信您应该对这两个操作使用相同的存储库封装。

于 2013-06-15T14:16:08.420 回答
1

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

于 2013-06-11T07:59:05.140 回答