如何为@Html.ValidationMessageFor()
中的每个item
添加collection
?说,
public class FooVm
{
// some property
public ICollection<BarVm> Bars { get; set; }
}
public class BarVm
{
// some property
[Range(1, int.Max, ErrorMessage = "Must be greater than 1")
public float? Fox { get; set; }
}
然后在view
@model namespace.here.FooVm
<div class="container"></div>
<a href="#" class="trigger">Populate</a>
<script>
$(function() {
var i = 0;
var populate = function() {
var strBuilder = '<input type="text" name="Bars[i].Fox" />';
$(".container").append(strBuilder);
return false;
};
$(".trigger").click(populate);
});
</script>
一切正常。但是如何在每个textbox
中添加验证?我正在使用ASP.NET MVC 4
仍在练习。我也在使用unobtrusive validation
进行客户端验证。任何你应该做的事情 - 这个建议或提示,示例代码将是伟大的。感谢。
答案 0 :(得分:2)
实际上,使用Javascript填充View并不是应该使用MVC的方式。相反,您可以渲染所有文本框:
首先是该类的代码:
public class FooVm
{
// some property
public List<BarVm> Bars { get; set; }
public FooVm()
{
// Make sure the collection exists to prevent NullReferenceException
this.Bars = new List<BarVm>();
}
}
public class BarVm
{
// some property
[Range( 1, Int32.MaxValue, ErrorMessage = "Must be greater than 1" )]
public float? Fox { get; set; }
}
现在是View的代码:
@model WebApplication2.Models.FooVm
<h2>Sample View</h2>
@using ( Html.BeginForm( "YourAction", "YourController" ) )
{
<div class="container">
@for ( int i = 0; i < Model.Bars.Count; i++ )
{
@Html.TextBoxFor( m => m.Bars[i].Fox )
@Html.ValidationMessageFor( m => m.Bars[i].Fox );
}
</div>
}
这将呈现必要的标签 - 当然还有验证消息位。但是,也可以使用
将所有错误消息组合在一个地方@Html.ValidationSummary()
如果您确实只想在单击按钮后显示内容,请考虑使用局部视图并加载该视图。这比尝试使用javascript创建所有必要的标签和属性以进行验证要好得多。
此致
谢