加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 在MVC中将值从Controller传输到Shared View

发布时间:2020-12-15 19:52:19 所属栏目:asp.Net 来源:网络整理
导读:我需要从控制器发送一些值到共享视图以显示在顶部 [HttpPost] [Route("login")] public async TaskActionResult Login(LogInRequest logInRequest) { IEnumerableUserClaim UserClaims = null; User user = null; if (ModelState.IsValid) { user = await Ge
我需要从控制器发送一些值到共享视图以显示在顶部
[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>

解决方法

我想你想要当前的请求,而不是所有的请求,所以接受的答案不是正确的方法.要在单个请求的范围内与视图或子控制器共享数据,最简单的方法是将数据放入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()对象的属性.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读