2017-03-31 138 views
2

我有以下视图模型:呈现CSHTML编辑的视图模型

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

在我的Razor视图我想实现一个表单,允许这种模式的版本,这是我做了什么:

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

这是工作,但它是一个有点沉重,因为我必须用新线每个I加入时间更新我的Razor视图或删除属性到我的视图模型。 不可能在一行中生成一个允许编辑所有viewmodel属性的窗体。我想这两个以下行,但它呈现什么:

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

你想制作一个自定义的文本框吗? –

回答

0

使用编辑器模板的整个整个的一点是可以自定义的东西如何出现。如果您只想致电Html.EditorForModel(),则可以在视图中直接进行操作,而无需编辑器模板。

这是不是特别工作的原因是因为你基本上有一个无限递归。 Html.EditorForModel()将利用编辑器模板(如果有的话)呈现模型的字段。从逻辑上讲,你不能在实际的编辑器模板中调用它。

如果你想简化事情,你应该在创建自定义编辑模板基本类型的工作:字符串,日期时间等,然后你可以调用像Html.EditorForModel(),它会使用渲染对模型所有产业领域这些属性类型的编辑器模板。这样,您就可以获得自定义字段,而无需手动指定每个字段。为复杂类型(如MyViewModel)创建编辑器模板的唯一原因是,如果您想在此处执行某些特定操作。否则,请保持独立。

FWIW,你应该从来没有在编辑器模板中包含一个实际的表单。这在许多层面上都是错误的,并且会产生比你想的更多的问题。