【发布时间】:2015-07-01 13:56:21
【问题描述】:
我有以下 ViewModel,其中填充了一些预定义的数据。其中一个预定义数据是 ApplicationParameter ViewModels 列表,它被设置为最初显示 n 个 ApplicationParameters。
我想要实现的是允许用户在单击按钮时添加额外数量的 ApplicationParameters ViewModel,这是我通过使用 ApplicationParameter 代码调用 PartialView 实现的。正如预期的那样,控件会自动添加,但在 ViewModel 中无法识别,因为它们没有正确的命名(因为它们是嵌套的)。
如何使动态添加的控件对 POST 返回的 ViewModel 可见。
视图模型
public class ApplicationVM
{
public int idApplication { get; set; }
public int idCompany { get; set; }
public string Company { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public string Link { get; set; }
public string Photo { get; set; }
public List<ApplicationParameterVM> ApplicationParameters { get; set; }
}
public class ApplicationParameterVM
{
public string Name { get; set; }
public bool Keep { get; set; }
}
动作视图(代码 sn-p)
<tbody id="editorRows">
@for (int i = 0; i < Model.ApplicationParameters.Count(); i++)
{
<tr>
<td>
@Html.TextBoxFor(m => Model.ApplicationParameters[i].Name, new { @class = "form-control" })
@Html.CheckBoxFor(m => Model.ApplicationParameters[i].Keep)
</td>
</tr>
}
</tbody>
添加ApplicationParameterVM的动作视图
@model AccessMarketmind.Areas.Administration.ViewModels.ApplicationParameterVM
@{
Layout = null;
}
<tr class="application-parameters">
<td>
@Html.TextBoxFor(m => Model.Name, new { @class = "form-control" })
@Html.CheckBoxFor(m => Model.Keep)
</td>
</tr>
我知道这个看起来微不足道,可以使用 Javascript 轻松完成,但问题是我有更复杂的 ViewModel(阅读:重嵌套),其中 Javascript 不是一个选项。
【问题讨论】:
-
我不明白为什么您仍然需要“添加 ApplicationParameterVM 的操作视图”。
-
@Sravan 也许我不够清楚,操作用于创建 ApplicationVM。由于 ApplicationParameters 是 ViewModel 的一部分,因此我在操作中需要它们。简而言之,我省略了不必要的代码。
-
您需要使用BeginCollectionItem 助手,或者对于纯客户端方法,refer this answer
-
@StephenMuecke 感谢您的回答,我将采用客户端方法,因为目前它是实现所需结果的更快方法。
-
它肯定会提供更好的性能(无需使用 ajax 并调用服务器来返回部分视图),但请记住,它有点难以维护 - 如果您更改或添加属性,甚至更改或在属性上添加验证属性,您还需要更新模板:)
标签: c# asp.net-mvc viewmodel