【发布时间】:2015-01-22 17:21:21
【问题描述】:
我有一个父模型,其中包含子模型用于预填充视图上的字段的属性。 我想将该属性移动到它所属的子模型中,但是当我这样做时,另一个属性的范围属性会失败。 当我有一个仅用于隐藏在 EditorTemplate 上的属性时,为什么范围属性验证失败?
模型看起来像
public class ParentModel
{
public SubModel subModel { get; set; }
}
public class SubModel
{
public uint? DefaultValue { get; set; }
[Required]
[Range(1,100)]
public uint RangedId { get; set;}
public bool EnableRange { get; set; }
}
视图(EditorTemplate)看起来像
@model SubModel
@Html.HiddenFor(model => model.DefaultValue)
@Html.TextBoxFor(model => model.RangeId)
<script>
$('#EnableRange').change(function() {
if($('#EnableRange').val()){
// remove the disabled attribute from the RangeId Field
} else {
// add the disabled attribute from the RangeId Field
}
}
</script>
控制器的样子
public ActionResult Create(TViewModel model)
{
try
{
if (ModelState.IsValid)
{
//Do Something Meaningful
}
//Redisplay the view
}
}
使用 SubModel 中的 DefaultValue 属性,即使在表单上禁用 RangeId 时,RangeId 的 Range 属性也会触发。这会导致 ModelState.IsValid 为假。 当我将 DefaultValue 属性向上移动到 ParentModel 时, RangeId 的 Range 属性不再触发(因为该字段已禁用)。这会导致 ModelState.IsValid 为真,因为 RangeId 永远不会被评估以进行验证。
【问题讨论】:
-
如果您发布视图呈现的 html 的 sn-p 可能会有所帮助。很难理解你试图用你的 js 做什么。
-
不清楚你在这里做什么。如果禁用控件,它不会回发,在这种情况下
ModelState将无效,因为RangedId的值是0
标签: c# asp.net-mvc asp.net-mvc-3 mvc-editor-templates editorfor