我需要能够在我正在处理的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没有按预期呈现?
答案 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)
}
应该这样做。