2014-10-31 7 views
5

Ho usato quanto segue nel mio MVC3 (aspx). NETFramework 4.0 funziona alla grande.SelectListItem/aggiornamento del modulo di domanda MVC3 4.0 a MVC5 4.5.1/visualizzazione del metodo di estensione

vista del metodo di pagina aggiuntiva:

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

modello parziale:

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

Nella vista:

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

Quando ho aggiornato l'applicazione per MVC5 .NETFramework 4.5.1. Per prima cosa non riuscivo a risolvere GetDropDownListItems, quindi l'ho copiato dal modello di estensione alla vista usando @functions, ottengo questo errore.

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. 

Un altra cosa, la soluzione MVC3 era un progetto, mentre MVC5 è multi strato e ho i modelli della strato di dominio, mentre l'estensione vista è il progetto come i punti di vista.

La mia domanda è perché non riesco a risolvere il metodo di estensione della visualizzazione di pagina?

Apprezzeremmo i vostri suggerimenti.

+0

'metodo GetDropDownListItems' aspetta 2 parametri' bool ?, bool 'ma il tuo passaggio tre' stringa, bool ?, bool'. –

+0

Hai ragione Stephen, ho postato il metodo sbagliato. Ho aggiornato la domanda con ulteriori dettagli sul metodo di estensione della visualizzazione. – hncl

+0

Il messaggio di errore è sempre lo stesso? (Non ha senso). La mia domanda è cosa dovrebbe fare comunque questo, e cosa è '@ Html.ExDropDownList()'? Sembra che tutto ciò possa essere fatto in poche righe di codice utilizzando i metodi incorporati di MVC –

risposta

6

ViewPage è una classe base per WebForms vista -style (http://msdn.microsoft.com/en-us/library/system.web.mvc.viewpage%28v=vs.118%29.aspx).

Razor viste utilizzano una classe diversa, WebViewPage (http://msdn.microsoft.com/en-us/library/gg402107%28v=vs.118%29.aspx).

Così, senza in realtà cercando di ricreare i vostri aiutanti, direi che come minimo è necessario appendere il metodo di estensione off di WebViewPage:

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

Grazie mille, funziona alla grande. Mi hai risparmiato toni di tempo. – hncl

Problemi correlati