2013-06-03 29 views
0

如果我有一個模型項目的集合,我將如何根據外部變量將一個項目綁定到視圖中的字段。在基於外部變量的集合中綁定一個項目

說我有這個模型:

public class Element 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public Guid ID { get; set; } 

    public virtual IList<ElementData> Data { get; set; } 

    [NotMapped] 
    public ElementData CurrentData 
    { 
     get 
     { 
      if (Data == null) 
       return null; 

      ElementData data = Data.FirstOrDefault(x => x.LanguageID == MyContext.Current.Language.ID); 
      if (data == null) 
       data = Data.FirstOrDefault(x => x.LanguageID == MyContext.Current.DefaultLanguage.ID); 

      return data; 
     } 
    } 
} 

public class ElementData 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public Guid ID { get; set; } 

    [Required] 
    [ForeignKey("Element")] 
    public Guid ElementID { get; set; } 

    [Required] 
    [ForeignKey("Language")] 
    public Guid LanguageID { get; set; } 

    public virtual Element Element { get; set; } 
    public virtual Language Language { get; set; } 
} 

查看:

@Html.HiddenFor(model => model.ID) 
@Html.HiddenFor(model => model.CurrentData.ID) 

<header class="editor-header"> 
    <div class="editor-title">     
     @Html.EditorFor(model => model.CurrentData.Name) 
     @Html.ValidationMessageFor(model => model.CurrentData.Name) 
    </div> 
</header> 
<hr /> 
<div class="editor-field"> 
    @Html.LabelFor(model => model.CurrentData.Content) 
    @Html.EditorFor(model => model.CurrentData.Content) 
    @Html.ValidationMessageFor(model => model.CurrentData.Content) 
</div> 

控制器:

[HttpPost] 
public string Edit(Element element) 
{ 
    if (ModelState.IsValid) 
    { 
     db.Entry(element).State = EntityState.Modified; 
     db.Entry(element.CurrentData).State = EntityState.Modified; // Exception here as CurrentData is null 
     db.SaveChanges(); 

     return "success"; 
    } 
} 

我張貼這種數據若要用此AJAX:

$(function() { 
    $(document).on("submit", "form", function (evt) { 
     evt.preventDefault(); 

     if ($(this).valid()) { 
      $.ajax({ 
       url: this.action, 
       type: this.method, 
       data: $(this).serialize(), 
       success: function (result) { 
        $('#result').html(result); 
       } 
      }); 
     } 
     return false; 
    }); 
}); 

該模型在控制器中有效,但很明顯,它不會重新填充ElementData列表,因爲它不能通過CurrentData來完成。我懷疑我只是不知道如何從我的元素數據列表中正確地綁定一個項目,但是我找不到一個指南,允許我從列表中挑選出一個項目。

回答

0

這裏的答案是創建一個更好的模型。我使用了視圖模型並在控制器中解決了這個問題。學習到教訓了。

相關問題