5

我想做这样的事情,这样我就可以创建一个模式对话框,稍后我会用 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("~/Views/Shared/EditorTemplates/ViewModel.cshtml", new ViewModel()) 可以解决问题,但我必须声明模板的完整路径……这有点糟糕。

那么有没有更好的方法呢?

4

1 回答 1

16

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

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

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

那应该行得通。

也就是说 -使用model表达式中的一部分有点奇怪。您也许应该考虑将对话框提取到它自己的具有ViewModel模型类型的局部视图中,然后您可以在其中使用,并使用 a作为您传递给它的模型EditorForModel从该父视图中调用它。new ViewModel()

于 2012-04-19T23:51:25.743 回答