关于asp.net mvc模型绑定及其参数

时间:2011-12-04 19:47:51

标签: asp.net-mvc-3 model-binding

以下是视图模型

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 个答案:

答案 0 :(得分:1)

列表在MVC中不起作用。你需要使用类似EditorFor(m =&gt; 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方法中解析字段并将数据放在您想要的位置。