Asp.net mvc MVC4多对多动态模型绑定

Asp.net mvc MVC4多对多动态模型绑定,asp.net-mvc,asp.net-mvc-4,many-to-many,model-binding,Asp.net Mvc,Asp.net Mvc 4,Many To Many,Model Binding,好的。我不知道如何正确地解释这个问题,这个问题的标题可能是错误的。我在参考和类别之间有一种多对多关系: public class Reference { public int Id { get; set; } public string Headline { get; set; } public virtual ICollection<Category> Categories { get; set; } } public class Category {

好的。我不知道如何正确地解释这个问题,这个问题的标题可能是错误的。我在
参考
类别
之间有一种多对多关系:

public class Reference
{
    public int Id { get; set; }
    public string Headline { get; set; }
    public virtual ICollection<Category> Categories { get; set; }
}
public class Category
{
    public int CategoryId { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Reference> References { get; set; }
}
因此,每次用户单击“添加新类别”按钮时,都会创建一个新的下拉列表,其中包含
name=“category[int].name”
。 这将使用一对多(一个类别用于引用)关系和文本框,而不是下拉列表。 这不是很好看的MVC(它非常网络化):)

你会怎么做

更新-提交数据时忘记提及结果。
将创建新类别。如果我选择两个类别作为参考,则会使用原始类别的
CategoryId
中的
Name
属性创建两个新类别。将在引用和新类别之间创建关系。Funky huh:)

看起来默认的ModelBinder实际上不知道如何将您的类别映射到数据库中的现有类别。这是您可能想考虑实现AutoMapper的地方(https://github.com/AutoMapper/AutoMapper/wiki/Getting-started)或者您自己的结构将您的新引用映射到现有类别的列表-您只需要迭代您已经发送的CategoryId集合,从数据库中检索它们并覆盖Reference.Categories

看来默认的ModelBinder并不知道如何将您的类别映射到数据库中的现有类别。这是您可能想考虑实现AutoMapper的地方(https://github.com/AutoMapper/AutoMapper/wiki/Getting-started)或者您自己的结构将您的新引用映射到现有类别的列表-您只需要迭代您已经发送的CategoryId集合,从数据库中检索它们并覆盖Reference.Categories

其实很简单。只需给出下拉列表name=“Category[int].CategoryId”而不是.name。然后手动循环遍历属性并绑定它。手动绑定时没有创建新的类别。

实际上它非常简单。只需给出下拉列表name=“Category[int].CategoryId”而不是.name。然后手动循环遍历属性并绑定它。手动绑定时未创建新类别。

为什么多对多不起作用?(也许我在这里没有得到什么)@torm-更新了问题我试图做一些修改,看看:@FelipeOriani-我知道你在那里做了什么。但这不是真正的问题,是吗?。这是行不通的,因为示例中遗漏了一些javascript来简化它,而这些javascript在代码中是行不通的?(也许我在这里没有得到什么)@torm-更新了问题我试图做一些修改,看看:@FelipeOriani-我知道你在那里做了什么。但这不是真正的问题,是吗?。这是行不通的,因为示例中遗漏了一些javascript来简化它,而这些javascript在代码中是行不通的。
<div class='meta-container meta-cat'>
    <div class="meta-sub">
          <div class="editor-label">Name</div>
          <select name="Categories[0].Name" value="">
             @{
               var db = new DbContext();
               var categories = db.Categories.ToList();
               foreach (var c in categories)
               {
                    <option value="@c.CategoryId">@c.Name</option>
               }
              }

          </select>
     </div>
</div>
     <div class="additonalContainersCats"></div>
     <input type="submit" value="Add another category" id="AddCat" />

    <script>
            $('#AddCat').click(function () {
                var propNumber = 0;
                var dropdown = $(this).parent().find('select').first();
                var options = "";
                $(dropdown, "option").each(function() {
                    options += $(this).html();
                });
                $('.meta-cat').each(function () {
                    propNumber++;
                });
                var html = "<div class='meta-container meta-cat'>" +
                                "<div class='meta-sub'>" +
                                    "<div class='editor-label'>Name</div>" +
                                    "<select name='Categories[" + propNumber + "].Name' value=''>" +
                                     options +
                                    "</select>" +
                                "</div>" +
                                "</div>" +
                            "</div>";
                $('.additonalContainersCats').append(html);
                return false;
            });
    </script>