如何创建适用于现有数据的编辑器模板?

时间:2015-06-17 20:04:13

标签: c# asp.net asp.net-mvc forms razor

我创建了一个编辑器模板来显示表单中包含的文本框。

    @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);
    }

如何允许此编辑器与现有数据以及新表单一起使用?

1 个答案:

答案 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; }

旁注:

  1. 您声称​​“当表格空白时,此功能很好” 意味着您没有将@Html.EditorFor(m => m.Person)的新实例传递给您 查看“创建”方法,这是不好的做法。你的控制器 方法应该将一个实例传递给视图。
  2. 您手动构建输入元素的当前模板 因为你从未设置PersonViewModel属性而无法工作。在 此外,您不添加用于客户端的value属性 边验证。始终使用强类型的html助手 生成你的html,这样你就可以得到正确的双向模型绑定 MVC的所有内置功能的优点。