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

yet 发布于 2019-03-09 最后更新 2019-03-09 14:37 3 浏览

我有我的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();
    }
}
我希望能够根据此会话变量显示不同的局部布局。什么是正确的方法来做到这一点?我可以从控制器加载部分视图还是需要在视图上处理这些视图? 这是一个我想用于确定特殊定价和着陆页广告素材的网站范围的变量。我是否必须在每一个控制器上设置相同的结构,还是有更全球的方法来做到这一点? 谢谢, 布赖恩
已邀请:

wodio

赞同来自:

根据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

jsed

赞同来自:

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

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