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; }
}
您的属性Tags
是IEnumerable<SelectListItem>
的类型,您不能将<select multiple>
绑定到复杂对象的集合。<select>
返回一个简单值的数组(所选选项的值)。
public IEnumerable<int> SelectedTags { get; set; }
假设Tag
的TagId
是int
的类型。然后视图中的代码是
@Html.ListBoxFor(m => m.SelectedTags , Model.Tags, new { @class = "form-control" })
指出:
- 不要使用
new { @name = "..." }
-幸运的是它什么也不做,生成的name
属性HtmlHelper
方法 - 不要使用
new { @multiple = "multiple" }
-ListBox()
和ListBoxFor()
方法已经生成 - 使用
TextBoxFor() and
TextAreaFor() '方法来生成您的其他表单控件,以便您获得正确的双向模型绑定 - 删除
SelectListItem
中的Selected = false
代码构造函数(不仅默认为false,而且忽略该值)无论如何,SelectedTags
的值决定了什么是选择)
使用IEnumerable只填充框,并添加另一个属性来保存从ListBox中选择的项值列表,如下所示:
public IEnumerable<string> SelectedTags { get; set; }
注意:SelectedTags填充将取决于你的SelectListItem被创建的方式。如果SelectListItem。Value设置后,SelectedTags将包含这些值,否则SelectedTags将填充SelectedListItem的值。文本属性。