【问题标题】:MVC: pass parameter to view?MVC:将参数传递给视图?
【发布时间】:2011-06-16 13:20:40
【问题描述】:

MVC 新手问题:

我正在获取go/{mainnav}/{subnav} 形式的 URL,我已成功将其路由到 GoController 类,方法:

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

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

myobj.mainnav = [value of mainnav parameter];

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

myobj.subnav = [value of subnav parameter];

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

【问题讨论】:

  • @dot.net : 你想知道 aspx 页面或 mvc1 或 mvc2 或 mvc3 或 mvc4 中的解决方案吗?

标签: c# asp.net-mvc visual-studio-2010


【解决方案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>

【讨论】:

    【解决方案2】:

    您是否尝试在您的视图中从 Request 访问参数?

    即

    Request.Params["mainnav"]
    

    或

    Request.Params["subnav"]
    

    在 MVC 中工作

    【讨论】:

    • 仅仅因为你能做到这一点,并不意味着你应该这样做。询问请求并收集数据以传递给视图是控制器的责任。控制器应决定从何处获取该数据。记住你的 SOLID 原则。
    【解决方案3】:

    您使用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 %>;
    

    不过,我建议您阅读unobtrusive javascript,看看您是否可以改进您的设计以避免这个特定问题。

    【讨论】:

      【解决方案4】:

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

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

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

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

      【讨论】:

        【解决方案5】:

        如果我理解这可能是一个解决方案:

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

        在 Html 视图中,您可以使用 View 之后

        <%=Model %>
        

        【讨论】:

        • ?不编译... |运算符不适用于字符串
        • 不抱歉,错过了理解,我的意思是你可以使用两个字符串之一......选择是由你自己分析你想做的事情(对不起,英语不好,我是意大利人)。
        • 他想同时将两个字符串传递给视图,导致你的解决方案不足。
        • 谢谢托马斯,我试着修正我的答案
        猜你喜欢
        • 2011-01-13
        • 2011-06-27
        • 2018-01-08
        • 2011-10-07
        • 1970-01-01
        • 2012-07-09
        • 2013-07-17
        • 2011-12-09
        • 2011-10-04
        相关资源
        最近更新 更多