2016-11-16 15 views
5

Tôi đang cố gắng để thêm một lỗi cho ModelState bằng cách sử dụng nameof:sử dụng nameof() để kiểm tra tên lớp với mẹ của nó để xác nhận MVC

@Html.ValidationMessageFor(m => m.Foo.Bar) 

Trong giao diện, điều này đã được gắn thẻ với một name của Foo.Bar.

Khi tôi thêm lỗi trạng thái mô hình, tôi phải nhập lỗi đó vào name, vì vậy tôi sử dụng nameof(Foo.Bar) - tuy nhiên điều này chỉ cho tôi Bar, khi tôi cần Foo.Bar. Ngay bây giờ tôi có thể hardcode Foo.Bar nhưng tôi muốn sử dụng một phương pháp mạnh mẽ đánh máy. Những lựa chọn của tôi là gì?

+0

'nameof (Foo) + "" + nameof (Bar) '? –

Trả lời

4

Không có cách tích hợp để thực hiện điều đó, nhưng có một số giải pháp.

Bạn có thể concantenate tên của các không gian tên mình (không bị phạt chạy, nhưng khó có thể duy trì):

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

Một lựa chọn khác là sử dụng reflecton để có được tên đầy đủ trực tiếp (dễ dàng hơn, nhưng có một số thời gian chạy hình phạt):

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

Hy vọng điều này sẽ hữu ích.

1

Cách tốt hơn là sử dụng cây biểu thức.
Bạn có thể có phương thức mở rộng ValidationMessageFor của riêng mình.
Kiểm tra NameOf phương pháp của tôi trong ví dụ sau

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)); 
     } 
    } 
} 
Các vấn đề liên quan