如何正确初始化共享视图?

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.cshtmlRenderBody() 调用中呈现。 (我觉得我错过了你想问我的本质。) 【参考方案1】:

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

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

【讨论】:

你让我走上了正确的道路,this answer 完成了图片。就我而言,正确的用法是RedirectToAction("Login", "Account", model );

以上是关于如何正确初始化共享视图?的主要内容,如果未能解决你的问题,请参考以下文章

如何在主活动中正确检索片段中的视图

SwiftUI视图依赖对象正确创建和初始化方法探究

SwiftUI视图依赖对象正确创建和初始化方法探究

如何在 ASP.NET CORE Razor Pages 中创建共享表单?

如何在带有标题视图和 UITableview 的自定义视图中正确设置 UISearchbar 的动画?

如何正确设置监听器?