在MVC中将值从Controller传输到Shared View

时间:2016-10-13 22:36:29

标签: asp.net-mvc asp.net-mvc-4

我需要从控制器向共享视图发送一些值以显示在

的顶部
    [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>

5 个答案:

答案 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):
     }