使用 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));
}
}
}
我正在尝试使用 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));
}
}
}