在cshtml中为viewmodel渲染编辑器

时间:2017-03-31 12:18:53

标签: c# asp.net-mvc razor

我有以下viewmodel:

public MyViewModel
{
       prop string p1 {get;set;}
       prop string p2 {get;set;}
}

在我的剃刀视图中,我正在尝试实现一个允许编辑此模型的表单,这就是我所做的:

@model MyViewModel
@using (Html.BeginForm("MyAction", "MyController", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
  @Html.TextBoxFor(model => model.p1)
  @Html.TextBoxFor(model => model.p2)
}

这是有效的,但是有点重,因为每次向viewmodel添加或删除属性时,我必须用新行更新我的剃刀视图。 无法在一行中生成允许编辑所有viewmodel属性的表单。我尝试了以下两条线,但它没有任何结果:

@model MyViewModel
@Html.EditorForModel() //or @Html.EditorFor(model => model)

1 个答案:

答案 0 :(得分:0)

使用编辑器模板的整个过程就是自定义事物的呈现方式。如果您只想调用Html.EditorForModel(),则可以直接在视图中执行此操作,而无需编辑模板。

这个特别不起作用的原因是因为你基本上有一个无限递归。 Html.EditorForModel()将使用编辑器模板(如果有)来渲染模型的字段。从逻辑上讲,您无法在实际的编辑器模板中调用它。

如果你想简化一些事情,你应该为基本类型创建自定义编辑器模板:String,DateTime等。然后你可以调用像Html.EditorForModel()这样的东西,它会为那里的所有属性渲染字段model 使用这些属性类型的编辑器模板。这样,您就可以获得自定义字段,而无需手动指定每个字段。为MyViewModel这样的复杂类型创建编辑器模板的唯一原因是,如果您想在那里做一些非常具体的事情。否则,不管它。

FWIW,您应该永远在编辑器模板中包含实际表单。这么多级别的错误,会产生比你认为的更多问题。