这是我面临的问题,甚至不知道如何解决它:
我在ASP.NET MVC 4中创建了模型、控制器和视图。有一次我不得不创建动态列表,所以我选择了KnockoutJS,这非常容易解决这个问题。到目前为止,一切都很好。然后我意识到我使用Fluent Validation在 MVC 模型上定义的验证在淘汰视图中不再起作用。
我搜索了 SO,发现几个可行的解决方案:
由于几个原因,我倾向于使用后一种。主要是因为它让我有机会不介绍(学习、测试、本地化、花时间)另一个库。
我对 MVC 非常熟悉,并且喜欢它支持本地化的方式,可以完全控制消息、标签等。我也喜欢 Fluent Validation 并且不想用其他人替换它(更静态,更难本地化,更不灵活我的喜好)
当 data-bind 必须变为 data_bind 等时,我发现了一些关于敲除到剃刀转换的示例。
我找不到用和 in 来表达 foreach 循环的方法。
MVC 视图模型
public class ContactEmail
{
public string SelectedLabel { get; set; }
public string Name { get; set; }
}
public class User
{
public IList<ContactEmail> Emails { get; set; }
}
ViewBag.EmailLabels = new string[] { "label1", "label2", ... };
淘汰赛模型
var viewModel = {
EmailLabels: ko.observableArray(@Html.Json(ViewBag.EmailLabels as string[]) || []),
Emails: ko.observableArray(@Html.Json(@Model.Emails) || []),
}
淘汰赛观点(我想改造)
<table>
<tbody data-bind="foreach: Emails">
<tr>
<td>
@* How to make razor below work instead of knockout syntax below it? *@
@*Html.DropDownListFor(m => ????, new { data_bind="options: $root.EmailLabels, value: SelectedLabel, optionsCaption: 'Choose...'" } )
<select data-bind="options: $root.EmailLabels, value: SelectedLabel, optionsCaption: 'Choose...'"></select></td>
<td>
@* How to make razor below work as well instead of knockout syntax below ?!?!? *@
@Html.TextBoxFor(m => ????, new { data_bind="value: Name, uniqueName: true" } )
<input type="text" data-bind="value: Name, uniqueName: true" class="required email" />
</td>
<td>
<a href="#" data-bind="click: function() { viewModel.removeEmail(this); }">Delete</a>
</td>
</tr>
</tbody>
</table>
我查看了MVC Controls 工具包,一个人无情地宣传它将解决我所有的验证和本地化以及所有问题。我发现它无法使用,非常专有且极难理解。就像买核弹杀鸟一样。
因此,请那些有过将 MVC 与淘汰赛结合的经验的人,请站出来分享您的经验。
任何帮助将不胜感激,并在此先感谢您。