MVC:传递参数来查看?

Sha*_*ica 14 c# asp.net-mvc visual-studio-2010

MVC新手问题:

我正在获取表单的URL go/{mainnav}/{subnav},我已成功路由到GoController该类,方法:

public ActionResult Index(string mainnav, string subnav) {
  return View();
}
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.但是现在我希望视图返回不同的HTML,具体取决于mainnav或subnav的值.具体来说,在javascript块中,我想要包含以下行:

myobj.mainnav = [value of mainnav parameter];
Run Code Online (Sandbox Code Playgroud)

并且,仅当subnav不为null或为空时:

myobj.subnav = [value of subnav parameter];
Run Code Online (Sandbox Code Playgroud)

如何将这些参数传递给没有代码隐藏的aspx页面?

Tom*_*han 31

您使用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;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你的行动方法出来了

public ActionResult Index(string mainnav, string subnav)
{
    return View(new IndexViewModel(mainnav, subnav));
}
Run Code Online (Sandbox Code Playgroud)

这意味着您的视图必须是强类型的:

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<YourNameSpace.IndexViewModel>" %>
Run Code Online (Sandbox Code Playgroud)

在您的视图中,您输出数据,如下所示:

myobj.mainnav = <%: Model.MainNav %>;
Run Code Online (Sandbox Code Playgroud)

如果使用MVC3,另一种解决方案是使用动态ViewBag:

public ActionResult Index(string mainnav, string subnav)
{
    ViewBag.MainNav = mainnav;
    ViewBag.SubNav = subnav;
    return View();
}
Run Code Online (Sandbox Code Playgroud)

这将在页面中访问如下:

myobj.mainnav = <%: ViewBag.MainNav %>;
Run Code Online (Sandbox Code Playgroud)

但是,我建议您阅读不引人注目的JavaScript,看看是否可以改进您的设计以避免这个特定问题.


Luk*_*dge 5

如果您使用 MVC3,我建议将值传递到ViewBag.

ViewBag.MainNav = "xxxx";
ViewBag.SubNav = null;
Run Code Online (Sandbox Code Playgroud)

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

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