gpt4 book ai didi

c# - 创建类型化的 ModelState.AddModelError()

转载 作者:太空狗 更新时间:2023-10-30 00:15:32 24 4
gpt4 key购买 nike

在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com