【发布时间】:2018-02-11 15:04:43
【问题描述】:
我可以在 ASP.NET Core 2.0 中做这样的事情吗?
例如,我有这个 ViewModel:
public class TodoViewModel
{
[Required(ErrorMessage = "Required !")] // <--- Required
public int? Key { get; set; } // Is Nullable
[Required(ErrorMessage = "Required !")] // <--- Required
public int? Value { get; set; } Nullable
[Required(ErrorMessage = "Required !")] // <--- Required
public byte Type { get; set; }
}
以视图为例,我有这个:
@Html.BeginForm(FormMethod.Post)
{
@if (Model.Type == 1)
{
@Html.TextBoxFor(x => x.Key)
@Html.ValidationMessageFor(x => x.Key)
}
@if (Model.Type == 2)
{
@Html.TextBoxFor(x => x.Value)
@Html.ValidationMessageFor(x => x.Key)
}
}
在行动中我有这个:
[HttpPost]
public IActionResult Todo(TodoViewModel model)
{
// My problem
// if model.type = 1 return ModelState has error validate for Property (Value) is Required
// and if model.type = 2 return ModelState has error validate for Property (Key) is Required
if (!ModelState.IsValid) // <-- Here is my problem
return View(model);
}
我不想使用@Html.HiddenFor()
覆盖其他属性的验证
我尝试使用 ActionFilterAttribute:
public class TodoActionFilter : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext context)
{
TodoViewModel model = (TodoViewModel) context.ActionArguments["model"];
if (model.Type == 1)
model.Value = 0;
if (model.Type == 2)
model.Key = 0;
}
}
但不幸的是,Execute for (OnActionExecuting) 是在 ModelState 为 Validation 之后。
有具体的方法吗?
如果“Type”属性等于 1,我想排除 ModelState 验证“Key”属性,
如果“Type”属性等于 2,则排除 ModelState 验证“Value”属性
【问题讨论】:
-
使用条件验证属性,例如 foolproof
[RequredIf]。或者,如果您想编写自己的参考The Complete Guide To Validation In ASP.NET MVC 3 - Part 2
标签: asp.net-core-mvc asp.net-core-2.0