ListBox没有发布到MVC控制器

时间:2016-11-17 18:41:29

标签: c# asp.net-mvc razor listbox

我有一个表格有一些文字区域和列表框。表单中的所有其他字段都被发布到控制器但不是ListBox?

这是Razor代码:

 <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; }
}

任何建议都表示赞赏。

2 个答案:

答案 0 :(得分:1)

您的属性Tags的类型为IEnumerable<SelectListItem>,您无法将<select multiple>绑定到复杂对象的集合。 <select>发布一系列简单值(所选选项的值)。

您的模型需要绑定的属性,比如说

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

假设TagId的{​​{1}}是Tag的类型。然后视图中的代码是

int

附注:

  1. 不要使用 @Html.ListBoxFor(m => m.SelectedTags , Model.Tags, new { @class = "form-control" }) - 幸运的是它什么也没做, 并且永远不要尝试覆盖由...生成的new { @name = "..." }属性 name方法
  2. 请勿使用HtmlHelper - new { @multiple = "multiple" }ListBox()方法已生成
  3. 使用ListBoxFor() TextAreaFor()`方法生成您的 其他表单控件,以便您获得正确的双向模型绑定
  4. 删除TextBoxFor() and中的Selected = false代码 构造函数(默认情况下不仅为false,忽略该值 无论如何 - 它的价值SelectListItem决定了什么 选择的)

答案 1 :(得分:1)

仅使用IEnumerable填充框并添加另一个属性以保存ListBox中所选项目列表的值,如下所示:

<table>
  <row>
    <column name="A">a1</column>
    <column name="B">b1</column>
    <column name="C">c1</column>
    <column name="key1">val1</column>
  </row>
  <row>
    <column name="A">a2</column>
    <column name="B">b2</column>
    <column name="C">c2</column>
    <column name="key1">val1</column>
  </row>
</table>

注意:SelectedTags填充将取决于您创建的SelectListItem的方式。如果设置了SelectListItem.Value,则SelectedTags将包含这些值,否则SelectedTags将使用SelectedListItem.Text属性的值填充。