使用 nameof() 检查 class 名称及其父级以进行 MVC 验证

using nameof() to inspect class name with its parent for MVC validation

我正在尝试使用 nameof:

向 ModelState 添加错误
 @Html.ValidationMessageFor(m => m.Foo.Bar)

在视图中,这已被标记为 name Foo.Bar

当我添加模型状态错误时,我必须将该错误键入 name,因此我使用 nameof(Foo.Bar) - 然而这只会在我需要时给我 Bar Foo.Bar。现在我可以硬编码 Foo.Bar 但我宁愿使用强类型方法。我有哪些选择?

没有内置方法可以做到这一点,但有一些解决方法。

您可以自己连接命名空间的名称(没有运行时损失,但难以维护):

String qualifiedName = String.Format("{0}.{1}", nameof(Foo), nameof(Bar));

另一种选择是使用反射器直接获取完全限定名称(更简单,但有一些运行时损失):

String qualifiedName = typeof(Foo.Bar).FullName;

希望对您有所帮助。

更好的方法是使用表达式树。
您可以拥有自己的 ValidationMessageFor 扩展方法。
在以下示例中检查我的 NameOf 方法

using System;
using System.Linq;
using System.Linq.Expressions;

namespace Name
{
    class MyClass
    {
        public int MyProperty { get; set; }
        public MyClass Foo { get; set; }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(new MyClass().NameOf(m => m.MyProperty));//MyProperty
            Console.WriteLine(new MyClass().NameOf(m => m.Foo.MyProperty));//Foo.MyProperty
            Console.ReadLine();
        }
    }

    public static class MyExtentions
    {
        public static string NameOf<T, TProperty>(this T t, Expression<Func<T, TProperty>> expr)
        {
            return string.Join(".", expr.ToString().Split('.').Skip(1));
        }
    }
}