【问题标题】:How to Properly Initialize a Shared View?如何正确初始化共享视图?
【发布时间】:2017-01-03 19:53:47
【问题描述】:

在实现this useful response 并将我的Login 视图移动到Shared 视图文件夹后,当我从另一个控制器调用它时,它没有被初始化。

我的电话号码:

[HttpGet]
public IActionResult AddressCorrectionList()
{
    if (ValidateSecurityToken()) // ensures the app server thinks we're still logged in
    {
        [deleted for clarity]
        return View(model);
    }
    else
    {
        return View("Login", new LoginViewModel { ReturnUrl = "/Report/AddressCorrectionList" });
    }
}

AccountController 中的操作被调用:

[ActionName("Login"), HttpGet]
[AllowAnonymous]
public IActionResult LoginGet(LoginViewModel model)
{
    ViewData["ReturnUrl"] = model.ReturnUrl;  // I set a breakpoint here.

    if (model.ReturnUrl != null)
    {
        model.InfoMessage = "Please login to access " + ResourceNameFor(model.ReturnUrl);
    }

    ModelState.Clear();
    return View(model);
}

如果我直接点击登录页面的链接,它就可以正常工作。我在LoginGet 中的断点被调用。

如果我尝试点击需要登录但我没有登录的页面的链接,它可以正常工作。我被正确地重定向到登录页面。我在LoginGet 中的断点被调用。

当我从另一个控制器(例如从两个代码 sn-ps 中的第一个)调用 View 时,就会出现问题。显示登录页面,但是我的LoginGet 断点没有被调用,我的ReturnUrl 没有设置。

ValidateSecurityToken 存在是因为尽管应用程序可能认为用户已登录,但我进行 API 调用的单独应用服务器可能会由于其自身的超时规则而将用户注销。

如何修复来自AddressCorrectionList 的呼叫,以便正确初始化视图?

【问题讨论】:

  • 也许一些清晰会有所帮助。那么,您是否将共享登录视图称为父视图的部分视图?如果没有,你是如何渲染的?
  • 这不是局部视图。它只是一个“正常”的.cshtml 视图,它曾经存在于Views/Account 目录中,并且可能在_Layout.cshtmlRenderBody() 调用中呈现。 (我觉得我错过了你想问我的本质。)

标签: c# asp.net authentication asp.net-core


【解决方案1】:

当调用 return View("viewName", model) 时,该 cshtml 文件直接使用给定模型呈现。 action LoginGet 永远不会被击中,因为您调用了一个方法来返回 view

您正在寻找的是执行RedirectToAction("LoginGet") 方法,或者它的任何重载。

【讨论】:

  • 你让我走上了正确的道路,this answer 完成了图片。就我而言,正确的用法是RedirectToAction("Login", "Account", model );
猜你喜欢
  • 1970-01-01
  • 2020-09-15
  • 1970-01-01
  • 1970-01-01
  • 2016-10-31
  • 1970-01-01
  • 2022-01-01
  • 2010-11-11
  • 2023-03-27
相关资源
最近更新 更多