如何正确初始化共享视图?
Posted
技术标签:
【中文标题】如何正确初始化共享视图?【英文标题】: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.cshtml
的RenderBody()
调用中呈现。 (我觉得我错过了你想问我的本质。)
【参考方案1】:
当调用 return View("viewName", model)
时,该 cshtml 文件直接使用给定模型呈现。 action LoginGet
永远不会被击中,因为您调用了一个方法来返回 view。
您正在寻找的是执行RedirectToAction("LoginGet")
方法,或者它的任何重载。
【讨论】:
你让我走上了正确的道路,this answer 完成了图片。就我而言,正确的用法是RedirectToAction("Login", "Account", model );
以上是关于如何正确初始化共享视图?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 ASP.NET CORE Razor Pages 中创建共享表单?