Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MVC: pass parameter to view?

MVC newbie question:

I'm picking up a URL of the form go/{mainnav}/{subnav}, which I've successfully routed to the GoController class, method:

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

So far, so good. But now I want the view to return different HTML, depending on the values of mainnav or subnav. Specifically, inside a javascript block, I want to include the line:

myobj.mainnav = [value of mainnav parameter];

and, only if subnav is not null or empty:

myobj.subnav = [value of subnav parameter];

How do you pass those parameters to an aspx page that doesn't have a codebehind?

like image 847
Shaul Behr Avatar asked Jan 27 '11 13:01

Shaul Behr


4 Answers

You use a ViewModel class to transfer the data:

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

Your action method then comes out

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

This means your view has to be strongly typed:

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

In your view, you output the data like so:

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

An alternative solution if you use MVC3, would be to use the dynamic ViewBag:

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

which would be accessed in the page as so:

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

However, I would recommend that you read up on unobtrusive javascript and see if you can improve your design to avoid this specific problem.

like image 67
Tomas Aschan Avatar answered Oct 17 '22 13:10

Tomas Aschan


If you are using MVC3 I would suggest passing the values into the ViewBag.

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

then on your view page, where you define the JavaScript and add the value.

if you dont have MVC 3 if you use ViewData["MainNav"]), to store your value has the same effect.

like image 23
Luke Duddridge Avatar answered Oct 17 '22 12:10

Luke Duddridge


Did you try accessing parameters from Request in your view?

i.e.

Request.Params["mainnav"]

or

Request.Params["subnav"]

Works in MVC

like image 26
Tejasvi Hegde Avatar answered Oct 17 '22 11:10

Tejasvi Hegde


i'm using following approach:

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

In the main View:

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

Then in a partial view:

@model XXX.Models.TitleBodyModel


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

    <div class="bl_body">@Model.Body</div>
</div>
like image 39
Stefan Michev Avatar answered Oct 17 '22 11:10

Stefan Michev