MVC: передать параметр для просмотра? - PullRequest
14 голосов
/ 27 января 2011

MVC вопрос новичка:

Я беру URL-адрес вида go/{mainnav}/{subnav}, который я успешно перенаправил в класс GoController, метод:

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

Пока все хорошо. Но теперь я хочу, чтобы представление возвращало другой HTML, в зависимости от значений mainnav или subnav. В частности, внутри блока javascript я хочу включить строку:

myobj.mainnav = [value of mainnav parameter];

и, , только если subnav не является нулевым или пустым :

myobj.subnav = [value of subnav parameter];

Как передать эти параметры на страницу aspx, у которой нет кодовой области?

Ответы [ 5 ]

31 голосов
/ 27 января 2011

Вы используете класс ViewModel для передачи данных:

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

Ваш метод действия затем выходит

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

Это означает, что ваше представление должно быть строго напечатано:

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

По вашему мнению, вы выводите данные следующим образом:

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

Альтернативным решением, если вы используете MVC3, было бы использование динамического ViewBag:

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

, который будет доступен на странице следующим образом:

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

Однако, я бы порекомендовал вам прочитать ненавязчивый JavaScript и посмотреть, сможете ли вы улучшить свой дизайнчтобы избежать этой конкретной проблемы.

3 голосов
/ 27 января 2011

Если вы используете MVC3, я бы предложил передать значения в ViewBag.

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

, затем на странице просмотра, где вы определяете JavaScript и добавляете значение.

если у вас нет MVC 3, если вы используете ViewData["MainNav"]), сохранение вашего значения имеет тот же эффект.

2 голосов
/ 15 октября 2015

Вы пытались получить доступ к параметрам из запроса на ваш взгляд?

т.е.

Request.Params["mainnav"]

или

Request.Params["subnav"]

Работает в MVC

1 голос
/ 22 января 2012

Я использую следующий подход:

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

На главном экране:

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

Затем в частичном представлении:

@model XXX.Models.TitleBodyModel


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

    <div class="bl_body">@Model.Body</div>
</div>
0 голосов
/ 27 января 2011

Если я понимаю, это может быть решением:

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

В представлении HTML вы можете использовать Просмотр и после

<%=Model %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...