2011-01-27 29 views
12

MVC domanda newbie:MVC: passare il parametro per visualizzare?

sto raccogliendo un URL della forma go/{mainnav}/{subnav}, che ho instradato con successo alla GoController di classe, metodo:

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

Fin qui, tutto bene. Ma ora voglio che la vista restituisca HTML diverso, a seconda dei valori di mainnav o subnav. In particolare, all'interno di un blocco javascript, voglio includere la riga:

myobj.mainnav = [value of mainnav parameter]; 

e, solo se subnav non è nullo o vuoto:

myobj.subnav = [value of subnav parameter]; 

Come si fa a passare i parametri a un aspx pagina che non ha un codebehind?

+1

@ dot.net: Volete sapere la soluzione in pagina aspx o mvc1 o MVC2 o MVC3 o mvc4? –

risposta

26

si utilizza una classe ViewModel per trasferire i dati:

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

tuo metodo di azione, allora viene fuori

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

Questo significa la visualizzazione deve essere fortemente tipizzato:

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

Nella tua visualizzazione, i dati vengono visualizzati in questo modo:

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

Una soluzione alternativa, se si utilizza MVC3, sarebbe quella di utilizzare la dinamica ViewBag:

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

che sarebbe accessibile nella pagina come in:

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

Tuttavia, vorrei consiglia di leggere su unobtrusive javascript e vedere se è possibile migliorare il design per evitare questo problema specifico.

0

se ho capito questo può essere una soluzione:

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

Nella visualizzazione HTML è possibile utilizzare View e dopo

<%=Model %> 
+0

? Non compilare ... | l'operatore non si applica alle stringhe –

+0

Non mi dispiace, mi manca la comprensione, voglio dire che puoi usare una delle due stringhe ... la scelta è fatta da te stesso analizzando cosa vuoi fare (scusa, pessimo inglese, sono italiano). –

+0

Vuole passare * entrambe * le stringhe alla vista * allo stesso tempo *, rendendo la soluzione insufficiente. –

3

Se si utilizza MVC3 vorrei suggerire di passare i valori in il ViewBag.

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

quindi nella pagina di visualizzazione, dove si definisce il JavaScript e si aggiunge il valore.

se non si dispone di MVC 3 se si utilizza ViewData["MainNav"], per memorizzare il valore ha lo stesso effetto.

1

sto usando il seguente approccio:

ViewModel.Classe:

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

Nella principale Vista:

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

Poi, in una vista parziale:

@model XXX.Models.TitleBodyModel 


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

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

Hai provato l'accesso ai parametri di richiesta nel vostro punto di vista?

cioè

Request.Params["mainnav"] 

o

Request.Params["subnav"] 

Opere in MVC

+0

Solo perché puoi farlo, non significa che dovresti. È responsabilità del controllore interrogare la richiesta e raccogliere i dati per passare alla vista. Il Controller dovrebbe prendere la decisione su dove reperire tali dati. Ricorda i tuoi principi SOLID persone. –

Problemi correlati