ValidationMessageFor与AddModelError(key,message)一起使用。 关键是什么?
我正在为某个viewModel属性开发客户端和服务器端validation。
在.cshtml
文件中我把它:
@Html.DropDownListFor(model => model.EntityType.ParentId, Model.ParentTypeList, "") @Html.ValidationMessageFor(model => model.EntityType.ParentId)
在Controller中进行业务validation
catch (BusinessException e) { ModelState.AddModelError("EntityType.ParentId", Messages.CircularReference); }
以上工作符合预期:如果捕获到exception,则消息将显示在下拉列表旁边。
但是,我发现这种方式并不是很优雅。 在cshtml
,我使用一种方法来生成有关validation的所有必需信息。 在控制器中,我必须知道确切的Key字符串并使用它。
这样做有没有更好的方法?
您可以编写一个扩展方法,该方法将为键而不是字符串采用lambda表达式:
public static class ModelStateExtensions { public static void AddModelError( this ModelStateDictionary modelState, Expression> ex, string message ) { var key = ExpressionHelper.GetExpressionText(ex); modelState.AddModelError(key, message); } }
然后使用此方法:
catch (BusinessException e) { ModelState.AddModelError( x => x.EntityType.ParentId, Messages.CircularReference ); }
我遵循@Darin Dimitrov解决方案,但我想避免
所以我使用了一些不同的方式,但为此你需要MyViewModel object variable.
public static class ModelStateExtensions { public static void AddModelError(this TModel source, Expression> ex, string message, ModelStateDictionary modelState) { var key = System.Web.Mvc.ExpressionHelper.GetExpressionText(ex); modelState.AddModelError(key, message); } }
如何使用:
catch (BusinessException e) { objMyViewModel.AddModelError(x => x.EntityType.ParentId, Messages.CircularReference, ModelState); }
您希望validation在客户端和服务器端进行,并且您还在寻找一个优雅的解决方案,然后为什么可以尝试创建自定义ValidationAttribute
。