- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在 Controller 中,我可以执行数据库查找等并添加一些与模型属性关联的错误消息:
public ActionResult CreateJob(CreateJobModel viewModel)
{
var call = FindCall(viewModel.CallNumber);
if (call == null)
{
ModelState.AddModelError("CallNumber", "Idiot User!");
}
}
我不喜欢 CallNumber 是一个字符串,理想情况下它应该直接引用 viewModel.CallNumber,如果我更改该属性的名称,它也应该更改。
我怎样才能做到这一点?
我想象代码最终会是这样的,它需要一个属性访问表达式:
AddModelFieldError(() => viewModel.CallNumber, "Idiot User!");
但我不确定如何创建这样的方法,或者在它是需要错误消息的子/内部属性的情况下。
最佳答案
我会编写自己的通用扩展方法:
public static class ModelStateDictionaryHelper
{
public static void AddModelError<TViewModel>(
this ModelStateDictionary me,
Expression<Func<TViewModel, object>> lambdaExpression, string error)
{
me.AddModelError(GetPropertyName(lambdaExpression), error);
}
private static string GetPropertyName(Expression lambdaExpression)
{
IList<string> list = new List<string>();
var e = lambdaExpression;
while (true)
{
switch (e.NodeType)
{
case ExpressionType.Lambda:
e = ((LambdaExpression)e).Body;
break;
case ExpressionType.MemberAccess:
var propertyInfo = ((MemberExpression)e).Member as PropertyInfo;
var prop = propertyInfo != null
? propertyInfo.Name
: null;
list.Add(prop);
var memberExpression = (MemberExpression)e;
if (memberExpression.Expression.NodeType != ExpressionType.Parameter)
{
var parameter = GetParameterExpression(memberExpression.Expression);
if (parameter != null)
{
e = Expression.Lambda(memberExpression.Expression, parameter);
break;
}
}
return string.Join(".", list.Reverse());
default:
return null;
}
}
}
private static ParameterExpression GetParameterExpression(Expression expression)
{
while (expression.NodeType == ExpressionType.MemberAccess)
{
expression = ((MemberExpression)expression).Expression;
}
return expression.NodeType == ExpressionType.Parameter ? (ParameterExpression)expression : null;
}
}
和用法:
ModelState.AddModelError<CreateJobModel>(x => x.CallNumber,
"some kind attention");
它看起来与您询问的版本有点不同,但我希望它是可以接受的替代方案。
关于c# - 创建类型化的 ModelState.AddModelError(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13564269/
使用 MVC 时,当属性级别出现错误时,我们可以将错误添加到 ModelState但同样的错误也被添加到摘要中。我们如何避免显示它两次。 我只想在消息摘要中显示公共(public)错误,而在属性级别显
在 Controller 中,我可以执行数据库查找等并添加一些与模型属性关联的错误消息: public ActionResult CreateJob(CreateJobModel viewModel)
我想添加一个 ModelState 错误,像这样: ModelState.AddModelError("", "Some message, click here) 但是,链接没有编码,因此显示为文本。
我的程序有可以创建项目(其行为类似于文件夹)的用户,并且用户可以在项目中添加文档。然后用户可以与其他用户共享该项目。 我已经阻止了用户可以在同一项目中两次添加同一个人,但我似乎无法显示我想要的错误消息
我有以下代码来生成 html 输入和验证消息。 @Html.ValidationSummary(false) ...... @Html.TextBoxFor(model => model.I
我想在 Controller 中捕获异常后为电子邮件字段设置错误消息: ... catch (EmailAlreadyExistsException emailAlreadyExistsExcepti
我正在使用 telerik mvc 网格。在我的表中,我为字段定义了唯一键。在 Controller 中,我使用 DbUpdateException 内的 try ... catch 捕获错误。 在
我正在阅读 NerDinner 免费教程 http://nerddinnerbook.s3.amazonaws.com/Intro.htm 我在第 5 步的某个地方说为了使代码更清晰,我们可以创建一个
使用 ModelState.AddModelError 验证表单上的输入时,我注意到一个奇怪的问题。 Html.ValidationMessage 的输出不是真正的 HTML 值,而是编码值,因此 C
我正在 Create(FooViewModel fvm){...} 中检查我的数据库,看看 fvm.prop1 和 fvm.prop2 是否存在> 已经存在于该组合中;如果是这样,我想向模型状态添加错
当使用 ModelState.AddModelError() 设置 mvc 错误时,我喜欢在我的 ASP.NET Core 应用程序中使用 nameof()。这减少了隐藏的错误,因为我在这里传递了一个
我有一个入站 View 模型列表,其中基本上有四个属性。 public class Complaint { public int Id { get; set;} public stri
我是 MVC4 的新手。在这里,我添加了 ModelState.AddModelError 消息以在无法执行删除操作时显示。 @Html.Valid
我有一个用例,我在 Controller 中对 GET 和 POST 操作使用了不同的模型。这对我来说非常有用,因为大部分数据都进入了标签。 GET 方法的模型包含 10 个属性,而 POST 方法的
AddModelError 的重载有用途吗? () 以 Exception 作为参数? 如果我在 Controller 中包含以下代码: ModelState.AddModelError( "", n
来源LoginRegister View 是这样的: @Html.Partial("authentication/_login") @Html.Partial("authentication/_reg
我正在为某个 viewModel 属性开发客户端和服务器端验证。 在 .cshtml 文件中我放了这个: @Html.DropDownListFor(model => model.EntityType
我在我的 Controller 中添加了验证检查,如果验证失败,它会修改 ModelState。 例如: private bool ValidateMoney(string raw, string n
我有以下 View ,它创建 10 个 ajax.beginform ,,但我面临的问题是,如果在创建对象期间发生错误,则 ModelState.AddModelError 将不会显示在 View 上
在我的测试 ASP.NET.CORE 项目中,我在我的 razor codeBehind 页面中添加了一个 ModelState 自定义错误,但它对 Html.ValidationMessageFor
我是一名优秀的程序员,十分优秀!