2013-01-13 125 views
1

好的。我不知道如何正確解釋這個問題,這個問題的標題可能是錯誤的。我有一個多對多的關係ReferenceCategory之間:需要MVC4多對多動態模型綁定

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個類別作爲參考,則使用原始類別的CategoryId中的Name屬性創建兩個新類別。在參考文獻和新類別之間建立關係。時髦呵呵:)

+0

爲什麼不能爲許多人工作? (也許我在這裏沒有東西) – torm

+0

@torm - 更新了問題 –

+0

我試圖做一些修改,看看:http://jsbin.com/awanur/1/edit –

回答

0

其實這很簡單。只需要給下拉列表name =「Category [int] .CategoryId」insted of .Name。然後我手動循環訪問屬性並綁定它。手動綁定時未創建新類別。

1

它看起來像默認ModelBinder不知道如何將您的類別映射到數據庫中的現有類別。這是您可能想要考慮實施AutoMapper(https://github.com/AutoMapper/AutoMapper/wiki/Getting-started)或您自己的結構來將您的新Reference與現有類別的列表進行映射 - 您只需要迭代您已經發送的CategoryID集合,從數據庫中檢索它們並覆蓋您的Reference.Categories。

+0

好的,謝謝。將嘗試! –