2012-03-21 12 views
57

Tengo un extraño problema con mi modelo aprobado a la vistaMVC 3 ¿No se puede pasar cadena como el modelo de una Vista?

controlador

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

Ver

@model string 

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

El mensaje de error

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 

¿Por qué no puedo pasar una cadena simple como modelo?

+1

¿Por qué estás usando esas rutas relativas? usa esto: 'View (" Sth ", null," abc ");' – gdoron

Respuesta

102

Sí se puede si está utilizando el derecho overload:

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

Tienes razón, funciona. Gracias – Tony

+16

Solución alternativa: 'return View (" ~/Views/Sth/Sth.cshtml ", modelo:" abc ")' – fejesjoco

+2

Otra solución: return View ("~/Views/Sth/Sth.cshtml", (object)"a B C") – Jas

16

Usted significaba esta View sobrecarga:

protected internal ViewResult View(string viewName, Object model) 

MVC es confundido por esta sobrecarga:

protected internal ViewResult View(string viewName, string masterName) 

Uso esta sobrecarga:

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

esta manera:

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

Por cierto, usted podría utilizar esto:

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

Overload resolution on MSDN

+1

Ahora veo, estaba usando el constuctor 'string viewName, modelo de objeto' – Tony

+2

@Tony. Querías decir 'método' no constructor, supongo. Y la 'Resolución de sobrecarga' Obtuvo el método incorrecto (para usted ...) – gdoron

+0

Incluso el simple hecho de encasillar la cadena al objeto probablemente hubiera ayudado a la resolución de sobrecarga:' return View ("Sth", (object) "abc"); ' , pero llamar al método 'View (string, string, object)' es definitivamente más claro, en cualquier caso. –

68

Si utiliza parámetros de llamada se puede omita la necesidad de dar el primer parámetro por completo

return View(model:"abc"); 

o

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

también servirá al propósito.

3

también funciona si se declara la cadena como un objeto:

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

O:

return View("abc" as object); 
4

También funciona si pasa nulo para los dos primeros parámetros:

return View(null, null, "abc"); 
Cuestiones relacionadas