我有一个表格有一些文字区域和列表框。表单中的所有其他字段都被发布到控制器但不是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; }
}
任何建议都表示赞赏。
答案 0 :(得分:1)
您的属性Tags
的类型为IEnumerable<SelectListItem>
,您无法将<select multiple>
绑定到复杂对象的集合。 <select>
发布一系列简单值(所选选项的值)。
您的模型需要绑定的属性,比如说
public IEnumerable<int> SelectedTags { get; set; }
假设TagId
的{{1}}是Tag
的类型。然后视图中的代码是
int
附注:
@Html.ListBoxFor(m => m.SelectedTags , Model.Tags, new { @class = "form-control" })
- 幸运的是它什么也没做,
并且永远不要尝试覆盖由...生成的new { @name = "..." }
属性
name
方法HtmlHelper
- new { @multiple = "multiple" }
和
ListBox()
方法已生成ListBoxFor()
TextAreaFor()`方法生成您的
其他表单控件,以便您获得正确的双向模型绑定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属性的值填充。