2016-11-17 51 views
0

我有一個窗體有一些文本區域和列表框。表單中的所有其他字段都發布到控制器,但不是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

您的財產TagsIEnumerable<SelectListItem>的類型,您無法將<select multiple>綁定到一組複雜對象。 A <select>回傳一組簡單值(所選選項的值)。

你的模型需要綁定到一個屬性,說

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

假設的TagTagId是typeof運算int。然後在視圖中的代碼是

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

旁註:

  1. 不要使用new { @name = "..." } - 幸好它什麼也不做, 從不試圖覆蓋由 的HtmlHelper方法
  2. 產生的 name屬性
  3. 請勿使用new { @multiple = "multiple" } - ListBox()ListBoxFor()方法已經生成
  4. 使用TextBoxFor() and TextAreaFor()`方法來生成 其他形式的控制,讓你得到正確的2路模型綁定
  5. SelectListItem 構造取下Selected = false代碼(它不僅是假的默認值被忽略 無論如何 - 它的這決定是 選擇什麼)
1

使用了IEnumerable只填充盒並添加另一個屬性來保存從列表框中選擇項值列表中的​​值,如下:

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

注:SelectedTags填充將取決於您的SelectListItem被創建的方式。如果設置了SelectListItem.Value,SelectedTags將包含這些值,否則SelectedTags將填充SelectedListItem.Text屬性的值。