О привязке модели asp.net к mvc и ее параметрах - PullRequest
0 голосов
/ 04 декабря 2011

Вот просмотр моделей

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 Ответ

1 голос
/ 05 декабря 2011

Списки не работают таким образом в MVC. Вам нужно использовать что-то вроде EditorFor (m => m.TagsList), а затем вам нужно создать BETag EditorTemplate. Но это только часть проблемы, и на самом деле она вам тоже не подойдет.

Что вам действительно нужно, так это простая строка, которая принимает ваш список тегов, например

public string TagListString {get;set;}

Затем в вашем контроллере вы анализируете строку и извлекаете все свои теги, а затем добавляете их в список тегов.

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 и поместить данные туда, где вы хотите.

...