MVC:将参数传递到视图?

16

MVC 新手问题:

我获取了一个形如 go/{mainnav}/{subnav} 的 URL,我已经成功将其路由到 GoController 类的方法中:

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

到目前为止,一切都很好。但现在我想让视图根据mainnav或subnav的值返回不同的HTML。具体来说,在javascript块中,我想包含以下行:

myobj.mainnav = [value of mainnav parameter];

当且仅当子导航不为null或空时:

myobj.subnav = [value of subnav parameter];

如何将这些参数传递给没有CodeBehind的aspx页面?


1
@dot.net:您想在aspx页面或mvc1或mvc2或mvc3或mvc4中了解解决方案吗? - Imad Alazani
5个回答

33

您可以使用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的内容,并尝试改进你的设计,避免这个具体的问题。


5
如果您正在使用MVC3,我建议将值传递到ViewBag中。
ViewBag.MainNav = "xxxx";
ViewBag.SubNav = null;

然后在您的视图页面上,定义JavaScript并添加值。

如果您没有MVC 3,如果使用ViewData [“MainNav”]),将您的值存储具有相同效果。


4

您尝试从请求中获取参数并在视图中使用吗?

例如:

Request.Params["mainnav"]

或者。
Request.Params["subnav"]

MVC中的工作


仅仅因为你可以这样做,并不意味着你应该这样做。控制器的责任是询问请求并收集数据以传递给视图。控制器应该决定从哪里获取数据。记住你的SOLID原则。 - Richard Hauer

1
我正在使用以下方法:

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
如果我理解正确,这可能是一个解决方案:
public ActionResult Index(string mainnav, string subnav)
{
   return View(mainnav | subnav);
}

在HTML视图中,您可以使用View和after。
<%=Model %>

无法编译... | 运算符不适用于字符串 - Shaul Behr
不好意思,我表达有误,我的意思是你可以使用其中的一个字符串...选择权在于你自己分析你想要做什么(抱歉,我的英语不好,我是意大利人)。 - Roberto Conte Rosito
他想要同时传递这两个字符串到视图中,从而使你的解决方案不够完善。 - Tomas Aschan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接