2014-10-31 7 views
5

Ich habe das folgende in meinem MVC3 (aspx) .NETFramework 4.0 funktioniert gut.SelectListItem/Aktualisierungsantragsformular MVC3 4.0 zu MVC5 4.5.1/View-Erweiterungsmethode

view page Erweiterungsmethode:

public static List<SelectListItem> GetDropDownListItems<T>(this ViewPage<T> viewPage, string listName, int? currentValue, bool addBlank) 
     where T : class 
    { 
     List<SelectListItem> list = new List<SelectListItem>(); 
     IEnumerable<KeyValuePair<int, string>> pairs = viewPage.ViewData[listName] as IEnumerable<KeyValuePair<int, string>>; 

     if (addBlank) 
     { 
      SelectListItem emptyItem = new SelectListItem(); 
      list.Add(emptyItem); 
     } 

     foreach (KeyValuePair<int, string> pair in pairs) 
     { 
      SelectListItem item = new SelectListItem(); 
      item.Text = pair.Value; 
      item.Value = pair.Key.ToString(); 
      item.Selected = pair.Key == currentValue; 
      list.Add(item); 
     } 
     return list; 
    } 

Teilmodell:

public static Dictionary<int, string> DoYouSmokeNowValues = new Dictionary<int, string>() 
     { 
      { 1, "Yes" }, 
      { 2, "No" }, 
      { 3, "Never" } 
     }; 
     public static int MapDoYouSmokeNowValue (string value) 
      { 
      return (from v in DoYouSmokeNowValues 
        where v.Value == value 
        select v.Key).FirstOrDefault(); 
      } 

     public static string MapDoYouSmokeNowValue (int? value) 
      { 
      return (from v in DoYouSmokeNowValues 
        where v.Key == value 
        select v.Value).FirstOrDefault(); 
      } 
     public string DoYouSmokeNow 
      { 
      get 
       { 
       return MapDoYouSmokeNowValue(DoYouSmokeNowID); 
       } 
      set 
       { 
       DoYouSmokeNowID = MapDoYouSmokeNowValue(value); 
       } 
      } 

Nach Ansicht:

@Html.ExDropDownList("DoYouSmokeNowID", this.GetDropDownListItems("DoYouSmokeNowValues", this.Model.PersonalSocial.DoYouSmokeNowID, false), this.isReadOnly) 

Wenn ich die Anwendung auf MVC5 .NETFramework 4.5.1 aktualisiert. Erstens konnte ich GetDropDownListItems nicht auflösen, also kopierte ich es aus dem Erweiterungsmodell in die Ansicht mit @Funktionen, ich bekomme diesen Fehler.

The type argument for method 'IEnumerable<SelectedItem> ASP._Page_Views_Visit_PhysicalExam_cshtml.GetDropDownListItems<T>(ViewPage<T>, string,,int?,bool)' cannot be inferred from the usage. Try specifying the the type arguments explicity. 

Eine andere Sache, die MVC3 Lösung war ein Projekt, während MVC5 Multi-Layer ist, und ich habe die Modelle in der Domänenschicht, während die Ansicht Verlängerung das Projekt als die Aussicht ist.

Meine Frage ist, warum ich die Methode der Seitenansichtserweiterung nicht lösen kann?

Wir würden uns über Ihre Vorschläge freuen.

+0

'GetDropDownListItems' Methode erwartet zwei Parameter' Bool ?, bool 'aber du passierst drei' string, bool ?, bool'. –

+0

Sie sind richtig Stephen, ich habe die falsche Methode veröffentlicht. Ich habe die Frage mit weiteren Details zur Methode der Ansichtserweiterung aktualisiert. – hncl

+0

Ist die Fehlermeldung immer noch gleich? (es ergibt keinen Sinn). Meine Frage ist, was das alles tun soll und was '' Html.ExDropDownList() '? Scheint so, als könnte das alles in ein paar Codezeilen gemacht werden, die die eingebauten Methoden von MVC verwenden. –

Antwort

6

ViewPage ist eine Basisklasse für WebForms -Stil Ansichten (http://msdn.microsoft.com/en-us/library/system.web.mvc.viewpage%28v=vs.118%29.aspx).

Razor Ansichten verwenden eine andere Klasse, WebViewPage (http://msdn.microsoft.com/en-us/library/gg402107%28v=vs.118%29.aspx).

Also, ohne tatsächlich zu versuchen, Ihre Helfer neu zu erstellen, würde ich vermuten, dass Sie bei einem Minimum müssen die Erweiterungsmethode aus der WebViewPage hängen:

GetDropDownListItems<T>(this WebViewPage<T> viewPage, string listName, int? currentValue, bool addBlank) 
+0

Vielen Dank, funktioniert super. Du hast mir Zeittöne gespart. – hncl