2011-01-27 15 views
12

MVC pregunta novato:MVC: ¿pasar parámetro para ver?

estoy detectando una URL de la forma go/{mainnav}/{subnav}, que he enrutan correctamente a la GoController clase, método:

public ActionResult Index(string mainnav, string subnav) { 
    return View(); 
} 

Hasta ahora, todo bien. Pero ahora quiero que la vista devuelva HTML diferente, según los valores de mainnav o subnav. En concreto, dentro de un bloque de Javascript, quiero incluir la línea:

myobj.mainnav = [value of mainnav parameter]; 

y, sólo si subnav no es nulo o vacío:

myobj.subnav = [value of subnav parameter]; 

¿Cómo se pasan los parámetros a un aspx página que no tiene un código detrás?

+1

@ dot.net: ¿Quieres saber la solución en la página aspx o MVC1 o MVC2 o MVC3 o mvc4? –

Respuesta

26

se utiliza una clase ViewModel para transferir los datos:

public class IndexViewModel 
{ 
    public string MainNav { get; set; } 
    public string SubNav { get; set; } 

    public IndexViewModel(string mainnav, string subnav) 
    { 
     this.MainNav = mainnav; 
     this.SubNav = subnav; 
    } 
} 

su método de acción y luego sale

public ActionResult Index(string mainnav, string subnav) 
{ 
    return View(new IndexViewModel(mainnav, subnav)); 
} 

Esto significa que su punto de vista tiene que ser inflexible:

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<YourNameSpace.IndexViewModel>" %> 

En su vista, puede generar los datos de la siguiente manera:

myobj.mainnav = <%: Model.MainNav %>; 

Una solución alternativa si utiliza MVC3, sería el uso de la dinámica ViewBag:

public ActionResult Index(string mainnav, string subnav) 
{ 
    ViewBag.MainNav = mainnav; 
    ViewBag.SubNav = subnav; 
    return View(); 
} 

que se accede en la página como así:

myobj.mainnav = <%: ViewBag.MainNav %>; 

Sin embargo, lo haría recomendamos que lea en unobtrusive javascript y vea si puede mejorar su diseño para evitar este problema específico.

0

si entiendo esto puede ser una solución:

public ActionResult Index(string mainnav, string subnav) 
{ 
    return View(mainnav | subnav); 
} 

En la vista HTML puede utilizar la vista y después de

<%=Model %> 
+0

? No compila ... | el operador no se aplica a las cadenas –

+0

No lo siento, señorita comprensión, quiero decir que puede usar una de las dos cadenas ... la elección la hace usted mismo analizando lo que quiere hacer (perdón, mal inglés, soy italiano) –

+0

Quiere pasar * ambas * cadenas a la vista * al mismo tiempo *, haciendo que su solución sea insuficiente. –

3

Si está utilizando MVC3 yo sugeriría que pasa los valores en el ViewBag.

ViewBag.MainNav = "xxxx"; 
ViewBag.SubNav = null; 

luego en su página de vista, donde se define el JavaScript y se agrega el valor.

si no tiene MVC 3 si usa ViewData["MainNav"]), almacenar su valor tiene el mismo efecto.

1

estoy usando el siguiente acercamiento:

ViewModel.clase:

public class TitleBodyModel 
{ 
    public string Title { get; set; } 

    public string Body { get; set; } 

    public TitleBodyModel() { Title = Body = ""; } 

    public TitleBodyModel(string t, string b) { this.Title = t; this.Body = b; } 
} 

en la vista principal:

@Html.Partial("_TitleBody" , new XXX.Models.TitleBodyModel("title", "body")) 

Luego, en una vista parcial:

@model XXX.Models.TitleBodyModel 


<div class="bl_item"> 
    <div class="bl_title">@Model.Title</div> 

    <div class="bl_body">@Model.Body</div> 
</div> 
2

¿Usted intentó acceder a los parámetros de la solicitud, en su opinión?

decir

Request.Params["mainnav"] 

o

Request.Params["subnav"] 

Obras en MVC

+0

El hecho de que pueda hacer esto, no significa que deba hacerlo. Es responsabilidad del Controlador interrogar la solicitud y recopilar datos para pasar a la Vista. El controlador debe tomar la decisión sobre dónde obtener esos datos. Recuerde sus principios SÓLIDOS personas. –

Cuestiones relacionadas