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