Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 使用ModelState.AddModelError时避免字符串文字_.net_Visual Studio 2013_Asp.net Mvc 5 - Fatal编程技术网

.net 使用ModelState.AddModelError时避免字符串文字

.net 使用ModelState.AddModelError时避免字符串文字,.net,visual-studio-2013,asp.net-mvc-5,.net,Visual Studio 2013,Asp.net Mvc 5,在我的MVC 5应用程序中,当我想返回表单值的验证错误时,我在控制器中使用以下模式: ModelState.AddModelError("PropertyName", "Validation Message"); AddModelError(ctrl => SomeProperty, "Validation failed"); 是否有一种推荐做法,在控制器中不使用字符串文字作为属性名 我正在使用.NET4.5,我不想升级到.NET4.6。 我正在使用Visual Studio 2013

在我的MVC 5应用程序中,当我想返回表单值的验证错误时,我在控制器中使用以下模式:

ModelState.AddModelError("PropertyName", "Validation Message");
AddModelError(ctrl => SomeProperty, "Validation failed");
是否有一种推荐做法,在控制器中不使用字符串文字作为属性名

我正在使用.NET4.5,我不想升级到.NET4.6。 我正在使用Visual Studio 2013,不希望升级到Visual Studio 2015。

C#6介绍了运营商,因此您可以执行以下操作:

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

但这需要Visual Studio 2015。

我认为可以这样实现:

1) 定义继承
控制器的基本控制器

class BaseController<TCtr> : Controller
class YourController : BaseController<TCtr>
protected virtual void AddModelError<TProp>(Expression<Func<TCtr, TProp>> expression, String message)
    {
        var prop = (MemberExpression)expression.Body;
        ModelState.AddModelError(prop.Member.Name, message);
    }
3) 在
BaseController
中定义以下函数:

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

谢谢你的快速回复。然而,我使用的是.NET4.5,我不想升级到.NET4.6。我更新了问题以包含这些信息。这是一个C#6编译器特性,而不是.NET4.6特性。在.NET4.0以后的版本中,您可以使用操作符的名称运行代码(我很确定您可以针对框架的任何版本,但我碰巧测试了.NET4.0…!),再次感谢。我也在使用Visual Studio 2013,不希望升级到Visual Studio 2015。