2012-03-21 15 views
57

Ho un problema strano con il mio modello passato alla vistaMVC 3 Impossibile passare la stringa come modello di visualizzazione?

controller

[Authorize] 
public ActionResult Sth() 
{ 
    return View("~/Views/Sth/Sth.cshtml", "abc"); 
} 

View

@model string 

@{ 
    ViewBag.Title = "lorem"; 
    Layout = "~/Views/Shared/Default.cshtml"; 
} 

Il messaggio di errore

The view '~/Views/Sth/Sth.cshtml' or its master was not found or no view engine supports the searched locations. The following locations were searched: 
~/Views/Sth/Sth.cshtml 
~/Views/Sth/abc.master //string model is threated as a possible Layout's name ? 
~/Views/Shared/abc.master 
~/Views/Sth/abc.cshtml 
~/Views/Sth/abc.vbhtml 
~/Views/Shared/abc.cshtml 
~/Views/Shared/abc.vbhtml 

Perché non posso passare una semplice stringa come modello?

+1

Perché stai utilizzando quei percorsi relativi? usa questo: 'View (" Sth ", null," abc ");' – gdoron

risposta

102

Sì, è possibile se si utilizza il diritto overload:

return View("~/Views/Sth/Sth.cshtml" /* view name*/, 
      null /* master name */, 
      "abc" /* model */); 
+0

Hai ragione, funziona. Grazie – Tony

+16

Soluzione alternativa: 'return View (" ~/Views/Sth/Sth.cshtml ", modello:" abc ")' – fejesjoco

+2

Un'altra soluzione: return View ("~/Views/Sth/Sth.cshtml", (oggetto) "abc") – Jas

16

volevi dire questo View sovraccarico:

protected internal ViewResult View(string viewName, Object model) 

MVC viene confuso da questo sovraccarico:

protected internal ViewResult View(string viewName, string masterName) 

Usa questo sovraccarico:

protected internal virtual ViewResult View(string viewName, string masterName, 
              Object model) 

questo modo:

return View("~/Views/Sth/Sth.cshtml", null , "abc"); 

Tra l'altro, si potrebbe utilizzare questo:

return View("Sth", null, "abc"); 

Overload resolution on MSDN

+1

Ora vedo, stavo usando il constuctor 'string viewName, object model' – Tony

+2

@Tony. Intendevi "metodo" non costruttore, immagino. E la 'risoluzione di sovraccarico' ha il metodo sbagliato (per te ...) – gdoron

+0

Anche solo la conversione di stringa in oggetto probabilmente avrebbe aiutato la risoluzione di sovraccarico:' return View ("Sth", (object) "abc"); ' , ma chiamare il metodo 'View (string, string, object)' è decisamente più chiaro, in entrambi i casi. –

68

Se si utilizzano parametri di nome si può saltare la necessità di dare il primo parametro del tutto

return View(model:"abc"); 

o

return View(viewName:"~/Views/Sth/Sth.cshtml", model:"abc"); 

sarà anche servire allo scopo.

3

Funziona anche se si dichiara la stringa come un oggetto:

object str = "abc"; 
return View(str); 

Oppure:

return View("abc" as object); 
4

Funziona anche se si passa null per i primi due parametri:

return View(null, null, "abc"); 
Problemi correlati