2011-02-11 31 views
28

Có thể ai đó vui lòng làm rõ điều gì đó cho tôi. Trong 2 ứng dụng ASP.NET MVC của tôi, tôi đã có một lớp BaseViewModel trong đó bao gồm các phương pháp sau đây:Các đối số kiểu không thể được suy ra từ việc sử dụng. Hãy thử xác định các đối số kiểu rõ ràng

public virtual IDictionary<string, object> GetHtmlAttributes<TModel, TProperty> 
         (Expression<Func<TModel, TProperty>> propertyExpression) 
{ 
    return new Dictionary<string, object>(); 
} 

Ý tưởng được rằng mỗi viewmodel đứa trẻ có thể ghi đè phương pháp này và cung cấp một tập hợp các thuộc tính html, dựa trên một số logic, để được trả lại trong giao diện:

<%: Html.TextBoxFor(model => model.MyProperty, Model.GetHtmlAttributes 
               (model => model.MyProperty)) %> 

Tuy nhiên khi sử dụng như trong dòng trên, tôi nhận được một lỗi biên dịch khi tôi nhấn xem:

những lập luận kiểu cho gặp hod '...BaseViewModel.GetHtmlAttributes<TModel,TProperty> Expression<System.Func<TModel,TProperty>)' không thể suy ra từ việc sử dụng. Hãy thử xác định các đối số kiểu một cách rõ ràng.

tôi phải làm như sau:

<%: Html.TextBoxFor(model => model.MyProperty, Model.GetHtmlAttributes 
          <ChildModel, string>(model => model.MyProperty)) %> 

Tôi chỉ tìm kiếm một số rõ ràng như thế nào nó cố gắng để suy ra các loại, nó đã không có vấn đề làm như vậy trong phương pháp HtmlHelper/TextBoxFor mở rộng?

Có phải vì HtmlHelper trong chế độ xem sẽ tự động là cùng loại như được chỉ định trong ViewUserControl ở đầu trang, trong khi mã của tôi có thể cho bất kỳ loại nào được kế thừa từ BaseViewModel? Có thể viết điều này theo cách mà nó có thể suy ra kiểu mô hình/thuộc tính của tôi không?

+5

Thanh cuộn ngang ngang! –

+2

Hoàn toàn đúng. Đó là vô lý trên 30 "màn hình của chúng tôi mà chúng tôi nhận được chỉ 6,5" để di chuyển mã qua lại trong các cửa sổ nhỏ. Hãy đến với các bạn SA, lấy tiền VC của bạn và nhận được với kích thước trang động! – Slaggg

Trả lời

11

Trong ví dụ của bạn, trình biên dịch không có cách nào để biết loại nào sẽ là TModel. Bạn có thể làm một cái gì đó gần với những gì bạn có thể đang cố gắng làm với một phương pháp mở rộng.

static class ModelExtensions 
{ 
    public static IDictionary<string, object> GetHtmlAttributes<TModel, TProperty> 
     (this TModel model, Expression<Func<TModel, TProperty>> propertyExpression) 
    { 
     return new Dictionary<string, object>(); 
    } 
} 

Nhưng bạn sẽ không thể có bất kỳ điều gì tương tự như virtual, tôi nghĩ vậy.

EDIT:

Trên thực tế, bạn có thể làm virtual, sử dụng Generics tự tham chiếu:

class ModelBase<TModel> 
{ 
    public virtual IDictionary<string, object> GetHtmlAttributes<TProperty> 
     (Expression<Func<TModel, TProperty>> propertyExpression) 
    { 
     return new Dictionary<string, object>(); 
    } 
} 

class FooModel : ModelBase<FooModel> 
{ 
    public override IDictionary<string, object> GetHtmlAttributes<TProperty> 
     (Expression<Func<FooModel, TProperty>> propertyExpression) 
    { 
     return new Dictionary<string, object> { { "foo", "bar" } }; 
    } 
} 
-3

Bạn đang tham chiếu đến loại thay vì trường hợp. Tạo chữ thường 'Mẫu' trong ví dụ trong các mẫu mã thứ hai và thứ tư của bạn.

Model.GetHtmlAttributes 

nên

model.GetHtmlAttributes 
+0

cảm ơn cho đề xuất, nhưng tôi cần phải cung cấp cho nó một ví dụ cụ thể của một đối tượng mô hình (tiếp xúc với thuộc tính Model của khung nhìn). 'mô hình' không thực sự tồn tại trong ngữ cảnh của tham số htmlAttributes của trình trợ giúp TextBoxFor. –

3

biên dịch C# chỉ có lambda

arg => arg.MyProperty 

cho loại suy luận của arg (TModel) một loại arg.MyProperty (TProperty). Điều đó là không thể.

14

tôi đã cùng một vấn đề này, giải pháp của tôi:
Trong web.cấu hình file:

<compilation debug="true>
phải được thay đổi để
<compilation debug="true" targetFramework="4.0">

+1

Cảm ơn rất nhiều Jim! Bạn đã lưu lại ngày của tôi, tôi đã google trong nhiều ngày và không tìm thấy giải pháp về các câu hỏi chính nhưng sau đó tìm thấy bạn ở đây trong một nhận xét nhỏ! Tôi đang sử dụng VS 2012 đi kèm với MVC 4.0, và có thêm targetFramework = "4.0" giải quyết các vấn đề với các đường màu đỏ trong ViewBag, Html.TextboxFor, vv – Nestor

+0

Tôi đã mở một [Câu hỏi có tiêu đề liên quan nhiều hơn] (http : //stackoverflow.com/questions/13695497/visual-studio-red-lines-under-viewbag-and-html-textboxfor-helpers-in-views/13695498#13695498), sử dụng câu trả lời của bạn và có tín dụng cho nó. Hy vọng nó sẽ giúp người khác. – Nestor

+0

Cảm ơn Jim, bạn đã cứu ngày của tôi. Bạn có thể giải thích tại sao targetFramework này quan trọng không? làm thế nào bạn tìm ra điều này? – Vincent

17

Tôi biết câu hỏi này đã có một câu trả lời được chấp nhận, nhưng đối với tôi, một người mới bắt đầu NET, có một giải pháp đơn giản với những gì tôi đã làm sai và tôi nghĩ tôi sẽ chia sẻ.

Tôi đã làm điều này:

@Html.HiddenFor(Model.Foo.Bar.ID) 

gì làm việc cho tôi được thay đổi như sau:

@Html.HiddenFor(m => m.Foo.Bar.ID) 

(nơi "m" là một chuỗi tùy ý để đại diện cho đối tượng mô hình)

0

Trong trường hợp nó giúp, tôi đã gặp phải vấn đề này khi vượt qua null thành tham số cho số chung TValue, để tránh việc này, bạn phải bỏ các giá trị rỗng của mình:

(string)null 

(int)null 

, vv

4

Lỗi này cũng có liên quan với một bộ nhớ cache vấn đề.

Tôi đã gặp sự cố tương tự và nó đã được giải quyết chỉ làm sạchxây dựng giải pháp một lần nữa.

+1

Đối với tôi nó cũng là một vấn đề bộ nhớ đệm, nhưng nó chỉ được giải quyết sau khi khởi động lại Visual Studio. Đối với tôi điều này xảy ra sau khi cập nhật các không gian tên của các mô hình đang được tham chiếu. – WillemdeKok

+1

Đến đây và nó đã được bộ nhớ đệm cho tôi quá! – lozzajp

Các vấn đề liên quan