2013-03-22 10 views
5

Tôi đang sử dụng MVG 3 đã giới thiệu WebGrid, nhưng không thể áp dụng các phương pháp mở rộng của riêng mình khi chuyển đại biểu cho thông số format.Tại sao tôi không thể sử dụng phương pháp mở rộng của mình trong đại biểu trong Razor WebGrid

Sử dụng:

Grid.Column("MyProperty", "MyProperty", 
format: @<span class="something">@item.MyProperty.MyExtensionMethodForString()</span>) 

tôi đã

ERROR: 'string' does not contain a definition for 'MyExtensionMethodForString' 

tôi đã cố gắng đúc, chưa tận dụng

Grid.Column("MyProperty", "MyProperty", 
format: @<span class="something">@((string)(item.MyProperty).MyExtensionMethodForString())</span>) 

Nếu tôi sử dụng một phương pháp tiêu chuẩn, nó hoạt động:

Grid.Column("MyProperty", "MyProperty", 
format: @<span class="something">@(Utils.MyExtensionMethodForString(item.MyProperty))</span>) 

Tôi cũng đã cố gắng đặt phần mở rộng trong cùng một không gian tên, không có kết quả.

Tôi có thể sử dụng tiện ích mở rộng yêu thích của mình bằng cách nào?

Sửa: Không gian tên cho mỗi gia nhập nó không phải là vấn đề, không gian tên nơi phần mở rộng có sẵn cho tất cả các quan điểm và các lớp học, và tôi có thể sử dụng nó trong giao diện tương tự mà không vấn đề. Vấn đề là khi sử dụng nó trong đại biểu.

Trả lời

2

Đây không phải là một giới hạn của WebGrid hoặc Razor. Đó là giới hạn của loại C# dynamic. Bạn không thể sử dụng các phương thức mở rộng trên động. Trình trợ giúp định dạng lấy một đối số Func<dynamic, object>, vì vậy tham số item là một loại động.

I wrote about this exact issue cách đây vài năm.

1

Điều này làm việc tốt cho tôi. lớp tĩnh:

public static class TestExtensions 
{ 
    public static string Foo(this HtmlHelper html, Func<object, HelperResult> func) 
    { 
     return func(null).ToHtmlString(); 
    } 

    public static string MyStringExtension(this string s) 
    { 
     return s.ToUpper(); 
    } 
} 

Index.cshtml:

@using MvcApplication1.Controllers 

@Html.Foo(@<text>@Html.Raw("Hello")</text>) 

Trang in ra:

Hello

Tuy nhiên, phiên bản này của Index.cshtml:

@using MvcApplication1.Controllers 

@Html.Foo(@<text>@("Hello".MyStringExtension())</text>) 

In ra thông báo lỗi của bạn:

CS1061: 'string' does not contain a definition for 'MyStringExtension' and no extension method 'MyStringExtension' accepting a first argument of type 'string' could be found (are you missing a using directive or an assembly reference?)

Vì vậy, tôi nghi ngờ Jon là đúng và đây là hạn chế với Razor. (tại sao nó hoạt động với HtmlHelper để lại cho tôi một chút hoang mang)

+0

Ví dụ đơn giản hơn nhiều. Tôi đoán tôi sẽ sống với cách giải quyết :). Cảm ơn bạn đã giúp đỡ. –

0

Tìm thấy câu hỏi này SO bằng cách nghiên cứu tại sao dòng sau đã ném các lỗi tương tự:

@a.GetAttribute<ActionLabelAttribute>().ActionLabel 

Hóa ra nó có thể dễ dàng được sửa chữa bằng cách kèm theo dòng này trong ngoặc đơn, như vậy:

@(a.GetAttribute<ActionLabelAttribute>().ActionLabel) 

Lưu ý: Phương thức mở rộng GetAttribute là từ here.