2014-10-31 4 views
5

Użyłem następujących w moim MVC3 (aspx) .NETFramework 4.0 działa świetnie.SelectListItem/aktualizowanie formularza wniosku MVC3 4.0 do MVC5 4.5.1/metoda rozszerzania widoku

widok przedłużenie strona metoda:

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; 
    } 

częściowy model:

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); 
       } 
      } 

W widoku:

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

Kiedy zaktualizowany wniosek do MVC5 .NETFramework 4.5.1. Po pierwsze nie mogłem rozwiązać GetDropDownListItems, więc skopiowałem go z modelu rozszerzenia do widoku przy użyciu @functions, pojawia się ten błąd.

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. 

Jeszcze jedno rozwiązanie MVC3 był jeden projekt, a MVC5 jest wielowarstwowa i mam modeli w warstwie Domeny, natomiast rozszerzenie widok jest projekt jako poglądów.

Moje pytanie brzmi: dlaczego nie mogę rozwiązać metody rozszerzenia widoku strony?

Doceniam Twoje sugestie.

+0

'metoda GetDropDownListItems' spodziewa 2 parametry' bool ?, bool 'ale twoje przejście trzy' string, bool ?, bool'. –

+0

Masz rację Stephen, napisałem niewłaściwą metodę. Zaktualizowałem pytanie, podając więcej szczegółów dotyczących metody rozszerzenia widoku. – hncl

+0

Czy komunikat o błędzie jest nadal taki sam? (to nie ma sensu). Moje pytanie brzmi: co to właściwie ma robić i co to jest '@ Html.ExDropDownList()'? Wygląda na to, że wszystko to można zrobić w zaledwie kilku liniach kodu, korzystając z wbudowanych metod MVC. –

Odpowiedz

6

ViewPage to klasa bazowa dla WebForms widok stylu (http://msdn.microsoft.com/en-us/library/system.web.mvc.viewpage%28v=vs.118%29.aspx).

Widły Razor używają innej klasy, WebViewPage (http://msdn.microsoft.com/en-us/library/gg402107%28v=vs.118%29.aspx).

więc bez faktycznie próbuje odtworzyć pomocników, to myślę, że przynajmniej trzeba powiesić metodę rozszerzenia off WebViewPage:

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

Dziękuję bardzo, działa świetnie. Uratowałeś mi dźwięki czasu. – hncl

Powiązane problemy