我需要一些关于如何使用来自数据库的值来声明全局变量的帮助......
我在应用程序中有两个分支,具有不同的_Layout,我使用来自数据库的类别ID来呈现视图,现在我想要一个情况,当用户登录到应用程序时,主要布局显示两个分支,当用户选择一个分支时,我想从数据库中获取该分支的类别ID并将其存储在HttpContext.Session [" CategoryID"]或HttpContext.Application [" CategoryID"]以便我可以使用此变量并在整个应用程序中呈现适当的布局,除非用户返回主菜单并在值可以更改之前选择另一个分支并使用所有视图呈现不同的布局。
这是我尝试的但是它没有工作
//GET: /Branch/
public ActionResult Index(int id)
{
var BranchId = _schoolService.getBranchById(id).SchoolCategoryId;
HttpContext.Session["BranchId"] = BranchId;
HttpContext.Application["BranchId"] = BranchId;
int branch = (int)HttpContext.Session["BranchId"];
if (branch == 1)
{
return View("Index", "~/Views/Shared/_LayoutBranch.cshtml");
}
else if (branch == 2)
{
return View("Index", "~/Views/Shared/_LayoutSecodary.cshtml");
}
else
return RedirectToAction("Error");
}
尝试从分支控制器的条目中存储变量,以便我可以在任何视图和控制器中调用它。
甚至尝试使用BaseController并在其他控制器中继承它,但它还没有工作。
所以,我在这里错过了一些东西,还是有任何其他方式我可以按照我想要的方式工作,请帮助,谢谢你的时间......
答案 0 :(得分:4)
我使用硬编码的BranchId = 1测试了您的代码,它可以工作。至少对于Index()动作,但我想你希望它适用于每个控制器中的所有动作。
尝试这样的事情:
搜索〜/ _ViewStart.cshtml 并用以下内容替换内容:
@{
Layout = "~/Views/Shared/_Layout.cshtml";
string layoutId = HelperMethods.GetLayoutId();
if(layoutId != null) {
switch(HelperMethods.GetLayoutId())
{
case "1":
Layout = "~/Views/Shared/_Layout1.cshtml";
break;
case "2":
Layout = "~/Views/Shared/_Layout2.cshtml";
break;
}
}
}
_ViewStart.cshtml指定每个视图的布局文件,但不指定它本身。因此,将代码写入此文件会导致整个应用程序的一个布局,具体取决于您的分支。注意:为了使其正常工作,在〜/ Views / 文件夹 / 文件 .cshtml下的视图文件中不得有任何布局分类。
修改强> 您可以使用一些静态方法来设置或获取布局ID。例如,单击按钮调用SetLayoutId(1),然后在_ViewStart.cshtml中调用会话。
using System.Web;
namespace SomeMVC
{
public static class HelperMethods
{
public static string GetLayoutId()
{
return (string) HttpContext.Current.Session["LayoutId"];
}
public static void SetLayoutId(string id)
{
HttpContext.Current.Session["LayoutId"] = id;
}
}
}