我想做这样的事情,这样我就可以创建一个模态对话框,我稍后会用 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")
我得到了错误
Templates can be used only with field access, property access, single-dimension array index, or single-parameter custom indexer expressions.
我不明白为什么它会关心实例在哪里或是什么(只要它的类型正确)
@Html.Partial("~/Views/Shared/EditorTemplates/ViewModel.cshtml", new ViewModel()) 可以解决问题,但我必须声明模板的完整路径……这有点糟糕。
那么有没有更好的方法呢?
最佳答案
从技术上讲,问题不在于实例。它是一个表达式,而不是一个函数,您将传递到那里,EditorFor
使用的表达式解析器,用于获取它用于识别属性等的元数据,不会不支持 new
表达式。
您可以简单地在 EditorFor 语句之外声明模型的新实例并执行此操作:
@{ var emptyViewModel = new ViewModel(); }
@Html.EditorFor(model => emptyViewModel, "ViewModelTemplateName")
这应该有效。
就是说 - 不在表达式中使用部分 model
有点奇怪。您也许应该考虑将对话框提取到它自己的部分 View 中,该部分 View 具有 ViewModel
作为模型类型,然后您可以在其中使用 EditorForModel
,并从此父级调用它使用 new ViewModel()
作为传递给它的模型进行查看。
关于c# - 如何在没有 View 模型的情况下使用@Html.EditorFor(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10238206/