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

时间:2016-11-16 07:40:18

标签: c# asp.net-mvc unobtrusive-validation

我尝试使用nameof:

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

在视图中,此标记为name Foo.Bar

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

2 个答案:

答案 0 :(得分:4)

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

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

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

另一个选择是使用reflecton直接获取完全限定名称(更容易,但有一些运行时间惩罚):

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

希望这有帮助。

答案 1 :(得分:1)

更好的方法是使用表达式树 您可以拥有自己的 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));
        }
    }
}