web-dev-qa-db-fra.com

MVC: paramètre passe à voir?

MVC newbie question:

Je récupère une URL de la forme go/{mainnav}/{subnav}, que j'ai correctement routée vers la classe GoController, méthode:

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

Jusqu'ici tout va bien. Mais maintenant, je souhaite que la vue renvoie un code HTML différent, en fonction des valeurs mainnav ou subnav. Spécifiquement, dans un bloc javascript, je veux inclure la ligne:

myobj.mainnav = [value of mainnav parameter];

et uniquement si subnav n'est ni nul ni vide:

myobj.subnav = [value of subnav parameter];

Comment passez-vous ces paramètres à une page aspx qui n'a pas de code-behind?

14
Shaul Behr

Vous utilisez une classe ViewModel pour transférer les données:

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

Votre méthode d'action sort alors

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

Cela signifie que votre vue doit être fortement typée:

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

Dans votre vue, vous sortez les données comme suit:

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

Une solution alternative si vous utilisez MVC3 serait d’utiliser la variable dynamique ViewBag:

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

qui serait accessible dans la page comme suit:

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

Cependant, je vous recommanderais de lire sur (JavaScript discret) et de voir si vous pouvez améliorer votre conception pour éviter ce problème spécifique.

31
Tomas Aschan

Si vous utilisez MVC3, je vous suggèrerais de passer les valeurs dans la variable ViewBag.

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

puis sur votre page d'affichage, où vous définissez le JavaScript et ajoutez la valeur.

si vous n'avez pas MVC 3 si vous utilisez ViewData["MainNav"]), stocker votre valeur a le même effet.

3
Luke Duddridge

Avez-vous essayé d'accéder aux paramètres à partir de Request selon vous?

c'est à dire.

Request.Params["mainnav"]

ou 

Request.Params["subnav"]

Fonctionne dans MVC

2
Tejasvi Hegde

j'utilise l'approche suivante:

ViewModel.class:

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

Dans la vue principale:

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

Puis dans une vue partielle:

@model XXX.Models.TitleBodyModel


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

    <div class="bl_body">@Model.Body</div>
</div>
1
Stefan Michev

Si je comprends cela peut être une solution:

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

Dans la vue HTML, vous pouvez utiliser Vue Et après.

<%=Model %>
0