【问题标题】:Avoiding string literals when using ModelState.AddModelError使用 ModelState.AddModelError 时避免使用字符串文字
【发布时间】:2016-03-27 19:12:18
【问题描述】:

在我的 MVC 5 应用程序中,当我想为表单值返回验证错误时,我在 Controller 中使用此模式:

ModelState.AddModelError("PropertyName", "Validation Message");

有没有推荐的做法是在 Controller 中不使用字符串字面量作为属性名?

我正在使用 .Net 4.5,我不想升级到 .Net 4.6。 我正在使用 Visual Studio 2013,不想升级到 Visual Studio 2015。

【问题讨论】:

    标签: .net visual-studio-2013 asp.net-mvc-5


    【解决方案1】:

    C# 6 引入了nameof 运算符,因此您可以执行以下操作:

    ModelState.AddModelError(nameof(this.PropertyName), "Validation Message");
    

    这需要 Visual Studio 2015。

    【讨论】:

    • 感谢您的快速回复 RB。但是我使用的是 .net 4.5,我宁愿不升级到 .net 4.6。我更新了问题以包含此信息。
    • 它是 C# 6 编译器功能,而不是 .NET 4.6 功能。您可以在 .NET 4.0 及更高版本上使用 nameof 运算符运行代码(我很确定您可以针对任何版本的框架,但我碰巧已经测试过 .NET 4.0...!)
    • 再次感谢。我也在使用 Visual Studio 2013,不想升级到 Visual Studio 2015。
    【解决方案2】:

    我觉得可以这样实现:

    1) 定义一个继承Controller的基本控制器:

    class BaseController<TCtr> : Controller
    

    2)让你的实际控制继承BaseController而不是Controller

    class YourController : BaseController<TCtr>
    

    3) 在BaseController 中定义以下函数:

    protected virtual void AddModelError<TProp>(Expression<Func<TCtr, TProp>> expression, String message)
        {
            var prop = (MemberExpression)expression.Body;
            ModelState.AddModelError(prop.Member.Name, message);
        }
    

    这允许您在控制器中编写类似这样的内容:

    AddModelError(ctrl => SomeProperty, "Validation failed");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-21
      • 2023-02-09
      • 2014-06-05
      • 2015-12-16
      • 1970-01-01
      • 1970-01-01
      • 2020-12-27
      相关资源
      最近更新 更多