1

好的。我不确定如何正确解释这一点,并且这个问题的标题可能是错误的。Reference我在和之间有多对多的关系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; }
}

在创建Reference条目时,用户应该能够根据需要添加尽可能多的类别(以包含所有可用类别的下拉列表的形式)。到目前为止,这是我为模型绑定器的视图提出的所有内容,无需控制器中的任何逻辑来创建相关数据:

<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>

因此,每次用户单击添加新类别按钮时,都会创建一个新的下拉列表name="Category[int].Name"。这适用于一对多(一个类别供参考)关系和文本框,而不是下拉列表。这不是很漂亮的 MVC(它的 webform'ish):)

你会怎么做?

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

4

2 回答 2

1

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

于 2013-01-14T07:52:57.210 回答
0

其实很简单。只需要给下拉列表 name="Category[int].CategoryId" insted of .Name。然后我手动循环遍历属性并绑定它。手动绑定时未创建新类别。

于 2013-01-18T22:50:01.997 回答