我不确定是否应该使用FormsCollection
或其他内容,使用此基本Create
视图。
(注意:我使用custom editor template作为标签ICollection<string>
)
public class Question
{
[Required, StringLength(100)]
public string Title { get; set; }
[Required]
public string Body { get; set; }
public ICollection<string> Tags { get; set; }
}
@model AWing.Core.Entities.Product
@{
ViewBag.Title = "Create";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>Create</h2>
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>Question</legend>
<div class="editor-label">
@Html.LabelFor(model => model.Name)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Name)
@Html.ValidationMessageFor(model => model.Name)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Description)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Description)
@Html.ValidationMessageFor(model => model.Description)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Tags)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Tags, "tags")
@Html.ValidationMessageFor(model => model.Tags)
</div>
<p>
<input type="submit" value="Create a new product" />
</p>
</fieldset>
}
[HttpPost]
public ActionResult Create(FormsCollection formsCollection)
{
... ????
}
或其他什么?
[HttpPost]
public ActionResult Create(... ??? ...)
{
.... ????
}
答案 0 :(得分:4)
由于你有一个强类型的视图,你可以让你的[HttpPost]
方法采用与变量相同的类型,例如:
[HttpPost]
public ActionResult Create(Product model)
{
if (ModelState.IsValid)
{
// add new product
.... ????
}
}
DefaultModelBinder
将获取返回的值,并将它们插入到强类型模型中。中提琴!
只要您的标签集合的模板模型是string
类型,MVC就会遍历集合,以便绑定它(尽管您可能需要更改ICollection
列表)。
<强>更新强>
正如我们在评论中所讨论的那样,不是每个标签创建一个文本框,而是创建一个单独的ViewModel,它具有您所有其他产品属性。</ p>
不要在ViewModel中使用List<string> Tags
,而是创建此属性:
public string TagCollection { get; set; }
在您的视图中,有TagCollection
的文本框。然后,在“创建”操作中,您可以将TagCollection字符串解析为标记列表。