ListBox不发送到MVC控制器

本文关键字:MVC 控制器 ListBox | 更新日期: 2023-09-27 18:18:23

我有一个表单,其中有一些文本区域和列表框。窗体中的所有其他字段都被张贴到控制器,但不是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; }
}

ListBox不发送到MVC控制器

您的属性TagsIEnumerable<SelectListItem>的类型,您不能将<select multiple>绑定到复杂对象的集合。<select>返回一个简单值的数组(所选选项的值)。

你的模型需要一个属性来绑定,比如
public IEnumerable<int> SelectedTags { get; set; }

假设TagTagIdint的类型。然后视图中的代码是

 @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() '方法来生成您的其他表单控件,以便您获得正确的双向模型绑定
  4. 删除SelectListItem中的Selected = false代码构造函数(不仅默认为false,而且忽略该值)无论如何,SelectedTags的值决定了什么是选择)

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

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

注意:SelectedTags填充将取决于你的SelectListItem被创建的方式。如果SelectListItem。Value设置后,SelectedTags将包含这些值,否则SelectedTags将填充SelectedListItem的值。文本属性。