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存储通话之间的信息。您还可以将其存储在会话中以获得更长的存储时间(不是永久存储)。如果在会话之间需要这个,我会考虑保存到数据库。