2011-12-04 79 views
-1

這裏是視圖模型關於asp.net的MVC模型綁定和它的參數

public class ArticleViewModel 
    { 
     public string ID { get; set; } 
     public string Title{ get; set; } 
     public string Body { get; set; } 
     public List<BETag> TagsList { get; set; } 

    } 

public class BETag 
    { 
     public string ID { get; set; } 
     public string Name { get; set; } 
    } 

的行動

[HttpPost, AuthorizeEx] 
    public ActionResult AddArticle(ArticleViewModel articleViewModel) 
    { 
     //articleViewModel.Tags.Count == 0 
     //Request.Form["TagsList"] == "tag1, tag2..." 
    } 

AddArticle.cshtml

@Html.TextAreaFor(m => m.TagsList) 

一部分我的問題是,爲什麼articleViewModel.Tags.Count等於0,但是 Request.Form["TagsList"]等於"tag1, tag2..."?如何正確綁定ArticleViewModel

回答

1

列表在MVC中不能以這種方式工作。你需要使用類似EditorFor(m => m.TagsList)的東西,然後你需要創建一個BETag EditorTemplate。但這只是問題的一部分,對你而言也不適合。

你真正想要的只是一個簡單的字符串,它需要你的標籤列表,如

public string TagListString {get;set;} 

然後,在你的控制器,你解析字符串並提取所有的標籤,然後將它們添加到TagsList。

var tags = TagListString.Split(' '); // assumes only single space between tags, 
            // you should add more filtering to make sure 

foreach(var tag in tags) { 
    TagList.Add(new BETag() { Name = tag }); 
} 

MVC適用於單個項目,而不是複雜類型。有些內置處理可以在某些情況下分解複雜類型,並自動迭代集合,但這些處理不適用於您的情況,因爲您想編輯單個字段中的所有項目。所以你唯一的選擇是解析post方法中的字段並將數據放在你想要的地方。