我需要从控制器向共享视图发送一些值以显示在
的顶部 [HttpPost]
[Route("login")]
public async Task<ActionResult> Login(LogInRequest logInRequest)
{
IEnumerable<UserClaim> UserClaims = null;
User user = null;
if (ModelState.IsValid)
{
user = await GetUserByEmailAndPassword(logInRequest.UserName, logInRequest.Password);
if (user.Id != 0)
{
showMenu = await ShowLoanMenu(logInRequest);
if (showMenu)
{
******** I need to send showMenu and user.Name to shared view
return RedirectToAction(Constants.Views.SearchView, Constants.Views.LoanDriverController);
}
}
.....
return View(logInRequest);
}
我不想使用TempData,viewdata,viewbag或session,如何通过查询字符串或添加到模型中发送它。
这是布局之一:
<ul>
<li class="logo">
<img src="~/Content/Images/logo.png" alt="" />
</li>
<li class="nav-item">
*** @if(showmenu is true)
{
<ul>
@Html.ActionLink("Loan Driver", "Index", "Home", new { area = "" }, new { @class = "navbar-brand" })
</ul>
}
</li>
</ul>
这是另一种布局:
<div class="header">
<div class="master-container">
<div class="heading">Garage</div>
<div class="primary-nav">
<ul>
<li>******show name of the person</li>
<li>@Html.ActionLink("Logout", "logout", "Home")</li>
</ul>
</div>
</div>
答案 0 :(得分:1)
创建一个公共/通用类并在那里定义一个公共静态属性,并从控制器设置它的值并在视图中访问它,如下所示:
<强> GeneralClass:强>
public static class GeneralUtility
{
/// <summary>
/// Username
/// </summary>
public static string Username = "";
}
<强>控制器:强>
GeneralUtility.Username ="sandip";
查看:强>
@if(GeneralUtility.Username=="sandip")
{
// rest of the logic
}
答案 1 :(得分:1)
在您的视图中,您可以从查询字符串中读取值,如下所示:
@Request.QueryString["name"]
然后,只需要在查询字符串中包含您想要的值,当您执行RedirectToAction时可以很容易地处理它,如下所示:
return RedirectToAction("Details", new { id = id, name = "value" })
答案 2 :(得分:1)
我想你想要当前的请求,而不是所有的请求,所以接受的答案不是正确的方法。要在单个请求的范围内与视图或子控制器共享数据,最简单的方法是将数据放入HttpContext.Items。在同一请求期间,所有视图和子控制器都共享此内容。
HttpContext.Items["UIOptions"] = new UIOptions { ShowMenu = true };
您可以使用扩展名对其进行抽象:
public static class HttpContextExtensions
{
public static UIOptions GetUIOptions(this HttpContext httpContext)
{
var options = httpContext.Items["UIOptions"] ?? (object) new UIOptions();
httpContext.Items["UIOptions"] = options;
return options;
}
}
然后在您的控制器中,设置选项
HttpContext.GetUIOptions().ShowMenu= true
在您看来,请按以下方式访问:
ViewContext.HttpContext.GetUIOptions()
我通常会进一步抽象,以便您使用
等属性对其进行配置[UIOptions(ShowMenu=true)]
public ActionResult MyAction()
{
return View();
}
所以你编写一个ActionFilter来检查动作的属性,并在ActionExecuting阶段使用属性属性设置httpContext.GetUIOptions()对象的属性。
答案 3 :(得分:0)
在这种情况下,Session
更适用于静态类中的静态字段或属性。您可以将扩展方法添加到HttpContext.User.Indetity
以显示用户名。
public static class UserExtension
{
public static void SetDisplayName(this IIdentity identity, string fullName)
{
if(HttpContext.Current.User.Identity.IsAuthenticated)
HttpContext.Current.Items[HttpContext.Current.User.Identity.Name] = fullName;
}
public static string GetDisplayName(this IIdentity identity)
{
return HttpContext.Current.Items[HttpContext.Current.User.Identity.Name] as string;
}
}
控制器中的:
public async Task<ActionResult> Login(LogInRequest logInRequest)
{
IEnumerable<UserClaim> UserClaims = null;
User user = null;
if (ModelState.IsValid)
{
user = await GetUserByEmailAndPassword(logInRequest.UserName, logInRequest.Password);
if (user.Id != 0)
{
showMenu = await ShowLoanMenu(logInRequest);
if (showMenu)
{
User.Identity.SetDisplayName(user.Name);
并在共享视图中:
<div class="primary-nav">
<ul>
<li>User.Identity.GetDisplayName()</li>
答案 4 :(得分:0)
您需要将共享模型传递给您的布局。让我们说SharedModel 模型的定义是
public class SharedModel
{
public string Name {get; set;}
public bool IsLoggedIn {get; set;}
}
所有其他模型都需要从SharedModel继承,例如AccountModel
public class AccountModel : SharedModel
{
public string Password {get; set;}
public string Username {get; set;}
}
因此,当您将特定模型传递给视图时,共享模型也将传递给您的共享布局。
[HttpPost]
[Route("login")]
public async Task<ActionResult> Login(LogInRequest logInRequest)
{
AccountModel aM = new AccountModel();
aM.Name = "Murtaza";
aM.IsLoggedIn = false;
....
....
return View(aM):
}