2011-02-11 13 views
28

Czy ktoś mógłby mi coś wyjaśnić. W mojej aplikacji ASP.NET MVC 2, mam klasę BaseViewModel który obejmuje następujące metody:Argumentów typu nie można wywnioskować z użycia. Spróbuj jednoznacznie podać argumenty typu.

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

Pomysł jest, że każdy ViewModel dziecko może zastąpić tę metodę i zapewnić odpowiedni zestaw atrybutów HTML, w oparciu na jakiejś logiki, które mają być świadczone w widoku:

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

jednak kiedy jest stosowany jako w wierszu powyżej, otrzymuję błąd kompilacji, kiedy uderzyć widok:

argumentów typu za spełnione hod '...BaseViewModel.GetHtmlAttributes<TModel,TProperty> Expression<System.Func<TModel,TProperty>)' nie można wywnioskować z użycia. Spróbuj jawnie określić argumenty typu.

muszę wykonać następujące czynności:

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

prostu szukam jakiegoś jasności, jak to próbuje ustalić typ, to nie ma problemu robi tak w metodzie HtmlHelper/TextBoxFor rozszerzenia?

Czy dlatego HtmlHelper w widoku zostanie automatycznie dla tego samego typu, jak określono w ViewUserControl na górze strony, podczas gdy mój kod może być dla każdego typu dziedziczy z BaseViewModel? Czy możliwe jest napisanie tego w taki sposób, aby można było wnioskować o moim typie modelu/właściwości?

+5

Holy poziomy paski przewijania batman! –

+2

Tak, całkowicie. To absurd na naszych 30-calowych monitorach, że dostajemy zaledwie 6,5 "do przewijania kodu w tych małych okienkach. Przyjdźcie, chłopaki z SA, zabierzcie pieniądze z VC i zyskajcie dynamiczny rozmiar strony! – Slaggg

Odpowiedz

11

W twoim przykładzie kompilator nie może wiedzieć, jaki powinien być typ: TModel. Możesz zrobić coś bliskiego temu, co prawdopodobnie próbujesz zrobić za pomocą metody rozszerzenia.

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

Ale nie będzie mógł mieć coś podobnego do virtual, myślę.

EDIT:

Właściwie można zrobić virtual, wykorzystując własny referential rodzajowych:

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

Masz na myśli typ, a nie instancję. Utwórz małą literę "Model" w przykładzie w drugiej i czwartej próbce kodu.

Model.GetHtmlAttributes 

należy

model.GetHtmlAttributes 
+0

dzięki za sugestię, ale muszę nadać mu konkretne wystąpienie obiektu modelu (wyeksponowane właściwość Model widoku). "model" w rzeczywistości nie istnieje w kontekście parametru htmlAttributes pomocnika TextBoxFor. –

3

kompilator C# mają tylko lambda

arg => arg.MyProperty 

dla typu wnioskować, arg (tModel) typ z arg.MyProperty (TProperty). To niemożliwe.

14

miałem ten sam problem, moje rozwiązanie:
w Sieci.Plik konfiguracyjny:

<compilation debug="true>
musiała zostać zmieniona na
<compilation debug="true" targetFramework="4.0">

+1

Wielkie dzięki Jim! Uratowałeś mi dzień, przeglądałem go przez kilka dni i nie znalazłem rozwiązania głównych pytań, ale znalazłem twoje tutaj w małym komentarzu! Używam VS 2012, który jest dostarczany z MVC 4.0, i tak dodanie targetFramework = "4.0" rozwiązało problemy z czerwonymi liniami pod ViewBag, Html.TextboxFor, itp. – Nestor

+0

Otworzyłem nowe [Pytanie z bardziej pokrewnym tytułem] (http : //stackoverflow.com/questions/13695497/visual-studio-red-lines-under-viewbag-and-html-textboxfor-helpers-in-views/13695498#13695498), użył twojej odpowiedzi i ma na nią kredyt. Mam nadzieję, że pomaga innym. – Nestor

+0

Dzięki Jim, uratowałeś mi dzień. Czy możesz wyjaśnić, dlaczego to miejsce docelowe jest ważne? jak to rozgryzłeś? – Vincent

17

Wiem, że to pytanie ma już zaakceptowanej odpowiedzi, ale dla mnie, początkujący .NET, nie było proste rozwiązanie do tego, co było robiąc źle i myślałem, że się podzielę.

I robił to:

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

Co pracował dla mnie zmieniał się następująco:

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

(gdzie "m" jest dowolna ciąg do reprezentowania modelu obiektowego)

0

Jeśli pomogę, napotkam ten problem, przekazując null do parametru generycznego TValue, aby obejść ten problem, musisz rzucić swoje wartości null:

(string)null 

(int)null 

itp

4

Ten błąd jest również związane z cache kwestii.

miałem ten sam problem został rozwiązany i to właśnie czyszczenia i budowy rozwiązanie ponownie.

+1

Dla mnie był to również problem z buforowaniem, ale został rozwiązany dopiero po ponownym uruchomieniu Visual Studio. Dla mnie stało się to po aktualizacji przestrzeni nazw modeli, do których odwoływano się. – WillemdeKok

+1

Przeniosłem się przez to i było to również buforowanie dla mnie! – lozzajp

Powiązane problemy