2013-08-26 97 views
9

Khi sử dụng helper HTML này trong cú pháp Razor:Các mẫu trình soạn thảo ASP.NET MVC và Html.EditorFor (...) - làm cách nào để phân biệt tên loại?

@Html.EditorFor(model => model.Prop1) 

... ước là để làm cho chế độ xem trong Views/<CrtView|Shared>/EditorTemplates/Prop1TypeName.cshtml.

Cho đến nay rất tốt. Lưu ý rằng nếu loại Prop1 (đủ điều kiện) là my.org.ns.TheType, thì tệp TheType.cshtml sẽ được hiển thị.

Nhưng nếu tôi có một mô hình với .Prop1.Prop2, và:

Prop1.GetType().FullName == "my.org.ns1.TheType"; 
Prop2.GetType().FullName == "my.org.ns2.TheType"; //same type name but different namespace 

và tôi gọi Razor này:

@Html.EditorFor(model => model.Prop1) 
@Html.EditorFor(model => model.Prop2) 

... Tôi có thể không nhận được nó để hiển thị khác nhau lượt xem cho các loại khác nhau.

Có cách nào để phân biệt điều này không?

Có thể có nhiều hơn tôi biết về quy ước đặt tên cho tệp .cshtml?

Trả lời

2

Bạn không nhất thiết phải sử dụng các quy ước. Bạn có thể có tên mẫu của riêng bạn.

Như thế này,

@Html.EditorFor(model => model.Prop1,"TheType_1") 
@Html.EditorFor(model => model.Prop2,"TheType_2") 

nơi "TheType_1" & "TheType_2" là các template khác nhau với nhiều loại khác nhau. Đây là một trong số six different overload methods khả dụng.

9

Bạn có thể sử dụng this overload để chỉ định tên của trình chỉnh sửa sẽ sử dụng. Với điều này, bạn sẽ đặt tên cho EditorTemplates First.cshtmlSecond.cshtml, sau đó trong Chế độ xem của bạn, hãy thực hiện việc này.

@Html.EditorFor(model => model.Prop1, "First") 
@Html.EditorFor(model => model.Prop2, "Second") 

Tuy nhiên, tôi khuyên bạn nên tránh sử dụng cùng tên kiểu trong cùng một dự án, ngay cả khi chúng có các không gian tên khác nhau. Điều này sẽ gây nhầm lẫn cho người đọc mã, thậm chí có thể bạn xuống đường. Đó là một vấn đề lớn hơn khung công tác không biết sử dụng mẫu nào.

+0

Tôi đồng ý với đề nghị của bạn không sử dụng tên cùng loại, nhưng nó không thể trong trường hợp này - đây là mã được tạo ra và tôi không thể kiểm soát tên được tạo ra. –

5

Khi kiểm tra các ASP.NET MVC source code (dòng 164):

// TODO: Make better string names for generic types 
yield return fieldType.Name; 

Nó có vẻ như nhóm phát triển nhận thức được rằng cách tiếp cận đơn giản này (fieldType.Name cho loại hình phức tạp) có thể là tiềm năng mơ hồ. tôi hy vọng họ sẽ tìm thấy một cách thanh lịch để cho phép chúng tôi chọn mẫu theo cách linh hoạt hơn.

Trong khi đó, bạn chỉ có thể sử dụng thuộc tính [UIHint], như sau:

[UIHint("ns1.TheType")] 
public TheType Prop1 { get; set; } 

[UIHint("ns2.TheType")] 
public TheType Prop2 { get; set; } 

Cập nhật (theo nhận xét của bạn):

Các [UIHint] chỉ có thể được sử dụng trên một tài sản hoặc một lĩnh vực, do đó bạn không thể sử dụng nó để trang trí lớp học của bạn.

Tuy nhiên, bạn có thể tạo thuộc tính của riêng bạn mà xuất phát từ UIHintAttribute:

[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Class, AllowMultiple = true)] 
public class MyUIHintAttribute : UIHintAttribute 
{ 
    public MyUIHintAttribute(string templateName) : base(templateName) 
    { 
    } 
} 

Sau đó, trang trí lớp học của bạn:

[MyUIHint("ns1.TheType")] 
public class TheType 
{ 
    .... 
} 

[MyUIHint("ns2.TheType")] 
public class TheType 
{ 
    .... 
} 
+0

+1, mặc dù không phải là rất hữu ích cho kịch bản cụ thể của tôi (mô hình là một danh sách các mục của các loại dị tính). Là 'UIHint' (hoặc có thuộc tính khác) có thể được áp dụng ở cấp' * type * thay vì các thuộc tính trang trí? –