EditorTemplate无法按预期呈现?

时间:2014-08-06 15:52:43

标签: c# asp.net-mvc razor asp.net-mvc-5 mvc-editor-templates

我需要能够在我正在处理的MVC 5应用程序中动态添加/删除行。我还在项目中包含了淘汰赛,因为我用它来回发到我的viewModel上的预制棒计算。

到目前为止我所做的工作是在我的用户模型上创建一个List来保存AdditionalUsers的详细信息:

public List<AdditionalUser> AdditionalUsers { get; set; }

其他用户类定义为:

public class AdditionalUser
{
    public string FirstName { get; set; }
    public string Surname { get; set; }
    public double Cost { get; set; }
}

然后我创建了一个EditorTemplates文件夹并创建了一个部分视图_AdditionalUser.cshtml,如下所示:

@model MyProject.Models.AdditionalUser

<td>
    @Html.TextBoxFor(model => model.FirstName)
</td>
<td>
    @Html.TextBoxFor(model => model.Surname)
</td>
<td>
    @Html.TextBoxFor(model => model.Cost)
</td>

我需要在我的用户视图中呈现的内容我已完成以下操作:

        <tr>
            @Html.EditorFor(model => model.AdditionalUsers)
        </tr>

视图上的每个人都有3个。然后在我的控制器中执行此操作,我在其中创建了我的用户模型:

model.AdditionalUsers =  new List<AdditionalUser>(2);

我原本以为会在tr中创建两个空行,我在其中调用了EditorFor但没有渲染任何内容?这只是我第一次让EditorTemplate工作的测试。我想然后将其连接到knockout以动态添加和删除行但首先我想知道为什么EditorTemplate没有按预期呈现?

4 个答案:

答案 0 :(得分:1)

您的编辑器模板命名不正确。 MVC有两种方法可以选择它:

按名称

将模板命名为与数据类型完全相同的名称:

DateTime.cshtml
String.cshtml
AdditionalUser.cshtml

<强>显式

在模型的属性中,使用UIHint属性:

public class MyModel
{
    public SomeObject TheObject { get; set; }

    [UIHint("SomeObject")]
    public SomeObject AnotherObject { get; set; }

}

此外,您的代码不正确,无法呈现行。您应该先将tr标记添加到视图中:

@model MyProject.Models.AdditionalUser

<tr>
    <td>
        @Html.TextBoxFor(model => model.FirstName)
    </td>
    <td>
        @Html.TextBoxFor(model => model.Surname)
    </td>
    <td>
        @Html.TextBoxFor(model => model.Cost)
    </td>
</tr>

接下来将您的父视图更改为类似的内容(请注意,为了清楚起见,我添加了表标题行):

<table>
    <tr>
        <th>@Html.DisplayNameFor(m => m.FirstName)</th>
        <th>@Html.DisplayNameFor(m => m.Surname)</th>
        <th>@Html.DisplayNameFor(m => m.Cost)</th>
    </tr>
    @Html.EditorFor(model => model.AdditionalUsers)
</table>

答案 1 :(得分:1)

你可以放弃&#34; _&#34;名称中的字符,或者有一个重载,它将模板名称作为第二个参数。

@Html.EditorFor(model => model.AdditionalUsers, "_AdditionalUsers")

答案 2 :(得分:0)

在您的GET操作方法中,您需要返回AdditionalUsers集合中的某些项目。试试这个。

var yourViewModel=new YourViewModel();

var userList =  new List<AdditionalUser>();
userList.Add(new AdditionalUser { FirstName ="A"} );
userList.Add(new AdditionalUser{ FirstName ="B"});

yourViewModel.AdditionalUsers =userList();
return view(yourViewModel);

此外编辑器模板名称应与类名相同,后者是编辑器模板剃刀视图的强类型,AdditionalUser.cshtml

答案 3 :(得分:0)

这是规则

1-模板的名称必须相同。在你的情况下,它必须是AdditionalUser.cshtml 2- MVC首先查看视图的父文件夹(具有控制器名称)中是否存在 EditorTemplates 文件夹,然后查看共享文件夹。

但是在你的情况下@Html.EditorFor(model => model.AdditionalUsers)是不行的,因为类型是List,据我所知,没有办法做到这一点所以使用foreach循环;

@foreach (var u in model.AdditionalUsers) {
    @Html.EditorFor(model => u)
}

应该这样做。