2016-11-17 2 views
0

У меня есть форма, которая содержит текстовые поля Area и ListBox. Все остальные поля в форме отправляются на контроллер, но не ListBox?ListBox не отправляет на контроллер MVC

Вот Бритва код:

<form method="post" action="/Admin/AddPost"> 
    @Html.ValidationSummary(true) 
    <div class="form-group"> 
     <label>Title</label> 
     <input type="text" class="form-control" name="BlogTitle" placeholder="Title" value="@Model.BlogTitle" required> 
    </div> 
    <div class="form-group"> 
     <label>Image</label> 
     <input type="text" class="form-control" name="BlogImage" value="@Model.BlogImage" placeholder="Image"> 
    </div> 
    <div class="form-group"> 
     <label>Description</label> 
     <textarea name="BlogDescription">@Model.BlogDescription</textarea> 
    </div> 
    <div class="form-group"> 
     <label>Tags</label> 
     @Html.ListBox("Tags", Model.Tags, new { @class = "form-control", @name = "Tags", @multiple = "multiple" }) 
    </div> 
    <button type="submit" class="btn btn-primary">Save</button> 
</form> 

Вот GET и POST от контроллера:

public ActionResult AddPost() 
    { 
     var model = new BlogModel 
     { 
      BlogTitle = string.Empty, 
      BlogDescription = string.Empty, 
      BlogImage = string.Empty, 
      Tags = new TagQueries().GetAllTags().Select(x => new SelectListItem 
      { 
       Text = x.TagName, 
       Value = x.TagId.ToString(), 
       Selected = false 
      }) 
     }; 
     return View(model); 
    } 
    [HttpPost] 
    public ActionResult AddPost(BlogModel model) 
    { 
     TransferBlogDetailsToDbModel addToDb = new TransferBlogDetailsToDbModel(); 
     if (ModelState.IsValid && model != null) 
     { 
      try 
      { 
       addToDb.TransferBlogDetails(model); 
       return RedirectToAction("Index", "Admin"); 
      } 
      catch (Exception) 
      { 
       ModelState.AddModelError("", "Invalid data,Please try again"); 
      } 
     } 
     return View(model); 
    } 

Вот Модель:

public class BlogModel 
{ 
    [HiddenInput] 
    public int BlogId { get; set; } 

    [Required(ErrorMessage = "Blog Title is required")] 
    public string BlogTitle { get; set; } 
    [Required(ErrorMessage = "Blog description is required")] 
    public string BlogDescription { get; set; } 
    public string BlogImage { get; set; } 

    public IEnumerable<SelectListItem> Tags { get; set; } 
} 

Любые предложения приветствуются.

ответ

1

Ваша недвижимость Tags is typeof IEnumerable<SelectListItem>, и вы не можете связать <select multiple> с коллекцией сложных объектов. A <select> отправляет обратно массив простых значений (значения выбранных опций).

Ваша модель должна свойство связываться, скажем

public IEnumerable<int> SelectedTags { get; set; } 

при условии, что TagId из Tag является TypeOf int. Затем код в представлении является

@Html.ListBoxFor(m => m.SelectedTags , Model.Tags, new { @class = "form-control" }) 

Боковые ноты:

  1. Не используйте new { @name = "..." } - к счастью, он не делает ничего, и никогда не пытаться переопределить атрибут name порожденную в HtmlHelper методов
  2. Не использовать new { @multiple = "multiple" } - ListBox() и ListBoxFor() методы уже генерируют то, что
  3. Используйте TextBoxFor() and TextAreaFor() `методы для генерации других элементов формы, так что вы получите правильную модель 2-полосные связывания
  4. Удалите Selected = false код в конструкторе SelectListItem (не только оно ложно по умолчанию значения игнорируются в любом случае - его значение SelectedTags, который определяет, что выбран )
1

Используйте IEnumerable только для заполнения поля и добавить еще одно свойство для хранения списка выбранных элементов значений из ListBox, следующим образом:

public IEnumerable<string> SelectedTags { get; set; } 

Примечание: Задание SelectedTags будет зависеть от способа создания вашего SelectListItem. Если параметр SelectListItem.Value установлен, SelectedTags будет содержать эти значения, иначе SelectedTags заполнит значение свойства SelectedListItem.Text.