asp.net-mvc3 EditorFor模板名称问题

时间:2011-11-22 14:13:46

标签: asp.net-mvc invalidoperationexception editorfor

我有一个关于MVC3的编辑器助手的奇怪问题。事情是这样的:我正在尝试显示一个checkboxList,如果我不调用明确的模板名称,它就可以工作。但是,如果我尝试使用模板名称,它会抛出一个异常,说我正在尝试传递一个通用列表,当我应该简单地传递我的viewModel。我将展示一些代码以使其更易理解:

视图模型

public class ChkViewModel
{
  public string ContractName {get;set;}
  public string Contract {get;set;}
  public bool Checked {get;set;}
}

EditorFor Template(称为ContractTemplate)

@model Models.ChkViewModel
<p>
    @Html.HiddenFor(x => x.Contract )
    @Html.LabelFor(x => x.ContractName , Model.ContractName )
    @Html.CheckBoxFor(x => x.Checked, new { @class = "chkContract" })
&nbsp;       
</p>  

摘自我的观点

<div id="contractContainer">
  @Html.EditorFor(item=>item.ContractList)
</div>

这很好用。但它试图这样做:

<div id="contractContainer">
  @Html.EditorFor(item=>item.ContractList, "ContractTemplate")
</div>

它抛出InvalidOperationException说我必须传递一个简单的ChkViewModel而不是GenericList ChkViewModel。

我只是问这个,因为我试图创建另一个复选框列表,我无法使其工作(甚至不显示复选框),当我尝试设置模板名称时,我至少可以看到复选框,它抛出了那个错误。

1 个答案:

答案 0 :(得分:6)

错误消息是正确的,如果您想使用模板名称,它应如下所示:

<div id="contractContainer">
    @for (int i = 0; i < item.ContractList.Count; i++) {
        @Html.EditorFor(item => item.ContractList[i], "ContractTemplate")
    }
</div> 

这类似于ASP.NET MVC在第一种情况下在幕后为您做的事情(它遍历集合并调用您的模板)。