【问题标题】:Redirecting from MVC route without entering new controller?在不输入新控制器的情况下从 MVC 路由重定向?
【发布时间】:2018-05-30 18:09:05
【问题描述】:

给定一条 MVC 路由:

[Route("user/{userId}")]
public async Task<ActionResult> GetUser(int userId)
{
    var vm = await _userService.GetVm();
    return View(vm);
}

当前浏览器显示/user/2,但我想“重定向”到/,去除蛞蝓。我说“重定向”是因为我不想重新路由;我想在GetUser 内完成这项工作并返回一个响应,告诉浏览器相应地更改显示的 URL。这可能吗?

【问题讨论】:

  • 我不太清楚你在问什么。你想在GetUser() 中做所有事情,然后当你希望你的URL 只是/
  • @maccettura 是的。 site.com/user/2 > GetUser() > site.com
  • 您想在工作完成后更改响应中的 url?
  • 我想我明白你的意思了,你有没有想过将 javascript 附加到更改 url 的视图中?它不是很干净,但这就是我能想到的,您需要客户端脚本来更改“无重定向”的 url
  • @L0uis 是的.....

标签: c# asp.net asp.net-mvc


【解决方案1】:

返回一个响应,告诉浏览器相应地更改显示的 URL

这不是 HTTP 请求/响应的工作方式。客户端请求 URL,服务器不响应 URL。但它可以做出多种回应。例如,如果您希望客户端向特定 URL 发出 新请求,这就是重定向:

return Redirect(Url.Content("~/"));

但是,如果您真的想要回复内容

return View(vm);

然后你的 content 需要做一些改变 URL 的事情。那将是in client-side code。我不希望它是 100% 可靠的,如果某些浏览器(或某些浏览器设置)认为它是潜在的安全欺骗并且不允许它,我也不会感到惊讶。


在这两种方法中,前者是最常见的。但是您在代码中显示的操作似乎并不保证。如果您的意图是从站点根目录显示有关用户(或数据中的任何记录)的信息,而不要求客户端导航到请求它的 URL,那么您可能想要让站点根目录发出 AJAX 请求数据。

【讨论】:

    【解决方案2】:

    重定向到主页索引操作。

    如果您在 Home Controller 中,请执行以下操作:

    public ActionResult Index()
    {
        return View()
    }
    
    [Route("user/{userId}")]
    public async Task<ActionResult> GetUser(int userId)
    {
        var vm = await _userService.GetVm();
    
        return PartialView("_JSRedirect", new JSRedirectViewModel() { Location = Url.Action("Index") });
    }
    

    您的 JSRedirectViewModel 将如下所示:

    public class JSRedirectViewModel
    {
        public string Location { get; set; }
    }
    

    您的 _JSRedirect 部分视图将如下所示:

    @model Adservio.Models.JSRedirectViewModel
    @{
        Layout = null;
    }
    
    <script type="text/javascript">
        window.location = '@Model.Location';
    </script>
    

    您通常会以这种方式从您的视图中调用 GetUser 操作:

    <div id="AlertDiv"></div>
    <div id="MsgDiv"></div>
    
    <button onclick="GetUser()">Perform User Action</button>
    
    <script type="text/javascript">
    
                $.post({
                     url: "@Url.Action("GetUser")",
                     data: {  },
                     global: false,
                     success: function (r) {
                         $('#AlertDiv').html(r);
                    }
                });
    
    </script>
    

    为 JQuery 道歉...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-14
      • 2020-04-22
      • 1970-01-01
      • 2012-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多