2012-07-13 32 views
2

當使用Razor爲具有子模型的複雜模型渲染表單時,我們通常會使用局部視圖呈現子模型。剃刀局部視圖前綴字段名稱

簡單的例子型號:

public class BlogPost 
{ 
    public string Content { get; set; } 
    public List<Comment> Comments { get; set; } 
} 

public class Comment 
{ 
    public string Content { get; set; } 
} 

BlogPost.cshtml:

@model BlogPost 

@Html.TextAreaFor(x => x.Content) 

@for (int i = 0; i < Model.Comments.Count; i++) 
{ 
    @Html.Partial('Comment', Model.Comments[i]) 
} 

Comment.cshtml:

@model Comment 

@Html.TextAreaFor(x => x.Content) 

現在的問題:

假設我們要將所有字段的值發送到以BlogPost作爲參數的控制器操作。中的字段將被回發到控制器像這樣:

含量= +的+博文&含量的+含量+ =的+第一+評論&含量=所述+第二+評論

內容= +的+博客帖子&評論[0] =。內容的第一+ +評論&的+含量+:我們需要有MVC正確映射他們的BlogPost視圖模型,我們需要這個命名約定什麼評論[1] .Content =第二+評論

如何以乾淨的方式實現這一目標?我們只能認爲哪種方式似乎都妥協設計:

  • 要麼我們通過BlogPost作爲模型的局部視圖,使得我們可以定義像這樣的文本區域:@Html.TextAreaFor(x => x.Comments[i].Content)。但是這意味着我們將註釋的部分視圖耦合到父視圖模型 - 您可以考慮在不同的上下文中使用相同的部分視圖的情況,如果部分視圖依賴於父視圖模型,則這是不可能的。此外,i將不得不以某種方式傳遞給部分視圖。
  • 或者我們回到明確定義每個字段的字符串的名稱:@Html.TextArea(ViewBag.Prefix + ".Content")

有什麼辦法告訴部分視圖應用某個前綴到所有的字段名?

回答

2

chiccodoro,

如果你創建和Comment類型的EditorFor模板,MVC將處理所有這一切爲你美麗。但是,只有在數據庫中已存在行的情況下才能正常工作。 Exampel從SO:

Submiting Parent & Children in razor

如果你需要動態創建新行,那麼你將不得不使用詭計的一點點,讓田裏的要求進行操作。我使用了史蒂文桑德森網站的一篇文章,它允許您在運行時添加收集項目,並仍保留不顯眼的驗證等。看到這個SO問題及相關的文章參考:

Editing a Variable Length List, ASP.NET MVC 3 Style with Table

+0

感謝,EditorFor是關鍵!也很高興閱讀一些史蒂文桑德森關於如何處理新行的提示。 – chiccodoro 2012-07-19 07:23:33

+0

chiccodoro - 很高興解決了你的問題。史蒂文桑德森的東西比我cvan說的更多次地拯救了我的燻肉。 – 2012-07-19 07:47:24