如何使用会话变量来确定视图?

时间:2013-04-11 16:18:07

标签: asp.net-mvc session-variables partial-views

我的global.asax设置包含以下Session_Start:

protected void Session_Start()
{
    HttpContext.Current.Session.Add("sourceCode", "default");
}

在我的控制器上,我有以下内容:

public ActionResult Index(string sourceCode)
{
    if (sourceCode != null && sourceCode != "default")
    {
        Session["sourceCode"] = sourceCode;
        return View();
    }
    else
    {
        return View();
    }
}

我希望能够根据此会话变量显示不同的部分布局。这样做的正确方法是什么?我可以从控制器加载局部视图,还是需要在视图上处理它?<​​/ p>

这是一个变量,我想在网站范围内使用它来确定特殊定价和着陆页广告素材。我是否必须在每个控制器上设置相同的结构,或者是否有更全面的方法来执行此操作?

谢谢, 布赖恩

2 个答案:

答案 0 :(得分:1)

如果要在所有页面中显示布局,可能需要在布局文件中添加逻辑。在那里,你会添加类似的东西(假设剃刀)

@if(HttpContext.Current.Session["someValue"]){
@*render some partial*@
}else{
@*render some other partial*@
}

答案 1 :(得分:0)

根据MVC的惯例,控制器应该决定它应该打开哪个视图。对于控制器中的这个,你有这样的代码:

public ActionResult Index(string sourceCode)
{
if (sourceCode != null && sourceCode != "default")
{
Session["sourceCode"] = sourceCode;
ViewData["PartialView"] = "partialviewname1";               
}
else
{
ViewData["PartialView"] = "partialviewname2";                
}
return View();
}

并且在视图中你可以编写如下代码:

<div>
@Html.Partial(Convert.ToString(ViewData["PartialView"]))
</div>

如果您已决定必须在每个请求上加载哪个部分视图,那么您可以在全局操作过滤器中编写上述逻辑。全局操作过滤器在任何请求的操作方法之前执行。要了解有关全局操作过滤器的更多信息,可以浏览此链接。 http://www.asp.net/mvc/tutorials/older-versions/controllers-and-routing/understanding-action-filters-cs