如何在没有视图模型的情况下使用@ Html.EditorFor()

时间:2012-04-19 23:19:30

标签: c# asp.net-mvc editorformodel

我想做这样的事情,所以我可以创建一个模态对话框,我将用jQuery调用

<div class="modal" id="modalName" style="display: none;">
<div class="modal-header">
    <a class="close" data-dismiss="modal">×</a>
    <h3>Edit Contacts</h3>
</div>
@using (Html.BeginForm("Index", "Home", FormMethod.Post, new Dictionary<string, object> { { "class", "form-horizontal" } }))
{
    <div class="modal-body">
    @Html.EditorFor(model => new ViewModel(), "ViewModelTemplateName")
    </div>
    <div class="modal-footer">
        <a href="#" class="btn" data-dismiss="modal">Close</a>
        <button type="submit" class="btn btn-primary">
            Submit</button>

    </div>
}
</div>

在这一行

@Html.EditorFor(model => new ViewModel(), "ViewModelTemplateName")

我收到错误

  

模板只能用于字段访问,属性访问,   单维数组索引或单参数自定义索引器   表达式。

我不明白为什么它会关心实例的位置或内容(只要是正确的类型)

@ Html.Partial(&#34;〜/ Views / Shared / EditorTemplates / ViewModel.cshtml&#34;,新的ViewModel())可以解决问题,但我必须声明模板的完整路径...这很糟糕。

那么有更好的方法吗?

1 个答案:

答案 0 :(得分:14)

从技术上讲,问题不在于实例。它是一个表达式,而不是一个函数,你要传递给EditorFor使用的表达式解析器,以获取它用于识别属性等的元数据,不支持new表达式。

您可以在EditorFor语句之外简单地声明模型的新实例,并执行以下操作:

@{ var emptyViewModel = new ViewModel(); }
@Html.EditorFor(model => emptyViewModel, "ViewModelTemplateName") 

这应该有效。

那说 - 使用表达式中model的一部分有点奇怪。您可能应该考虑将对话框提取到它自己的部分视图中,该视图具有ViewModel作为模型类型,然后您可以使用EditorForModel,并使用{{1从此父视图调用它作为传递给它的模型。