C# 为所有要使用的控制器和视图设置变量

C# 为所有要使用的控制器和视图设置变量,c#,asp.net,asp.net-mvc,razor,C#,Asp.net,Asp.net Mvc,Razor,如果可能的话,我想从所有页面/视图中设置一个公共变量,该变量位于我的BaseController中。我有一个名为header.cshtml的局部视图,其中有一个下拉列表,其中包含客户及其id。当用户选择客户时,我需要将该CustomerId值存储到BaseController上的公共变量中。如果我的方法错误,请纠正我的错误,但我需要用户选择客户的方法,然后导航到另一个页面(其中包含标题视图),下拉列表需要保留他们在上一个页面上选择的客户 这是我的BaseController: public cl

如果可能的话,我想从所有页面/视图中设置一个公共变量,该变量位于我的
BaseController
中。我有一个名为
header.cshtml
的局部视图,其中有一个下拉列表,其中包含客户及其id。当用户选择客户时,我需要将该
CustomerId
值存储到
BaseController
上的公共变量中。如果我的方法错误,请纠正我的错误,但我需要用户选择客户的方法,然后导航到另一个页面(其中包含标题视图),下拉列表需要保留他们在上一个页面上选择的客户

这是我的
BaseController

public class BaseController : Controller
{
    private CurrentUser _currentUser;
    public CurrentUser CurrentUser { get; set; }

    protected override void Initialize(RequestContext requestContext)
    {
        base.Initialize(requestContext);

        Session.TryGetAuthenticatedValue(out _currentUser);
        CurrentUser = _currentUser;
    }

    public ActionResult SetSelectedCustomerId(int value)
    {
        CurrentUser.SelectedCustomerId = value;
        return Json(new { success = true });
    }
}
Header.cshtml

<div class="col-md-3" style="padding-top:5px;">
    @Html.DropDownList("customers", ViewBag.CustomerList as IEnumerable<SelectListItem>,
        "--Select Customer--",
        new
        {
            @id = "ddlCustomer",
            @style = "width:390px;",
            @onchange = "javascript:SetCustomerId(this.value);",
            @class = "form-control"
        });
</div>

@Html.DropDownList(“客户”,ViewBag.CustomerList为IEnumerable,
“--选择客户--”,
新的
{
@id=“客户”,
@style=“宽度:390px;”,
@onchange=“javascript:SetCustomerId(this.value);”,
@class=“表单控制”
});

我缺少的部分是ajax或其他方法,在其中调用BaseController上的公共操作。

如果您在每个页面上都需要customerid,并且仅针对当前会话,您可以将其缓存在浏览器localstorage中,并根据需要检索它。对,但customerid是CurrentUser对象的属性,它还保存了其他重要信息的更多Id。我希望避免将所有内容都塞进会话变量中,并可能暴露所有不必要的数据。如果我有Id,我可以执行
获取
并只检索所需的信息。好吧,你只提到了选定的customerId:)一般来说,我不喜欢基本控制器将其用作“存储”,因为这会很快失去控制,然后你会在每个控制器实例上旋转庞大的基本控制器。如果您需要持久化的选择状态,我可能会在某个地方查看缓存,前端、后端应用程序缓存等。。。另外,…如果您不想缓存CurrentUser对象,因为它包含与某些区域无关的数据,…这可能是重构数据的一个标志,您需要从更具体的数据中缓存应用程序范围的数据?很好的一点…我对MVC世界相当陌生,因为我90%的开发时间都花在WinForms上。在我们使用WebForms的旧网站中,我们使用了Singleton类并将所有内容存储在会话中……这是个坏主意,因为正如您所说,它很快就会失控。您应该使用TempData来存储CurrentUser。在“向导”页面调用的每个操作中,您都会检索、更新并将其放回末尾。TempData存储通话之间的信息。您还可以将其存储在会话中以获得更长的存储时间(不是永久存储)。如果在会话之间需要这个,我会考虑保存到数据库。