我创建了一个编辑器模板来显示表单中包含的文本框。
@model WebApplication1.Models.PersonViewModel
<input type="text" class="form-control" name="@ViewData.TemplateInfo.HtmlFieldPrefix" value=""/>
我只是想包含“表格控件”。用于收集此模型数据的所有输入文本框中的类。
public class PersonViewModel
{
[UIHint("_TextFormControl")]
public string FirstName { get; set; }
[UIHint("_TextFormControl")]
public string LastName { get; set; }
public int Age { get; set; }
}
当表单空白时,这很有用,但是,当我将模板用于预先填充数据的表单时,就像我想要编辑现有模型一样,我收到错误消息:&#34;模型传入字典的项目类型为&#39; System.String&#39;,但此字典需要类型为&#39; WebApplication1.Models.PersonViewModel&#39;的模型项目。&#34;
这是我的控制器:
// GET: /Person/Edit/5
[HttpGet]
public ActionResult Edit(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Person person = db.Persons.Find(id);
if (person == null)
{
return HttpNotFound();
}
return View(person);
}
如何允许此编辑器与现有数据以及新表单一起使用?
答案 0 :(得分:1)
您已为EditorTemplate
类型创建了PersonViewModel
,但您对[UIHint("_TextFormControl")]
类型string
的使用意味着您将string
传递给模板,而不是{ {1}}。它还不清楚你想要在这里实现什么,但根据你当前的模型,他的模板需要
PersonViewModel
然而,这与在视图中使用@model String
@Html.TextBox("") // or @Html.TextBoxFor(m => m)
(或@Html.EditorFor(m => m.FirstName)
)相同。你可以做这样的事情的一个原因是生成多个html元素,例如
TextBoxFor()
以便在主视图中使用@model String
@Html.Label("")
@Html.TextBox("")
@Html.ValidationMessage("")
生成验证消息的标签,文本框和占位符。
但是,使用自定义编辑器模板的一个真正好处是,当您将它们用于复杂类型并希望为这些类型提供一致的UI时。例如,您可以为typeof @Html.EditorFor(m => m.FirstName)
创建模板。在PersonViewModel
中(请注意,模板的名称必须与类型名称匹配)
/Views/Shared/EditorTemplates/PersonViewModel.cshtml
然后在主视图中
@model WebApplication1.Models.PersonViewModel
<div>
@Html.LabelFor(m => m.FirstName)
@Html.TextBoxFor(m => m.FirstName)
@Html.ValidationMessageFor(m => m.FirstName)
</div>
<div>
@Html.LabelFor(m => m.LastName)
@Html.TextBoxFor(m => m.LastName)
@Html.ValidationMessageFor(m => m.LastName)
</div>
.... // ditto for other properties of PersonViewModel
这也适用于@model WebApplication1.Models.PersonViewModel
@Html.EditorFor(m => m)
的集合,并为集合中的每个PersonViewModel
生成一个编辑器模板
PersonViewModel
同样,如果您有另一个包含属性@model IEnumerable<WebApplication1.Models.PersonViewModel>
@Html.EditorFor(m => m)
的模型,则可以使用public PersonViewModel Person { get; set; }
旁注:
@Html.EditorFor(m => m.Person)
的新实例传递给您
查看“创建”方法,这是不好的做法。你的控制器
方法应该将一个实例传递给视图。PersonViewModel
属性而无法工作。在
此外,您不添加用于客户端的value
属性
边验证。始终使用强类型的html助手
生成你的html,这样你就可以得到正确的双向模型绑定
MVC的所有内置功能的优点。