从MVC路由重定向而不进入新控制器?

时间:2018-05-30 18:09:06

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

鉴于MVC路线:

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

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

2 个答案:

答案 0 :(得分:3)

  

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

这不是HTTP请求/响应的工作方式。客户端请求一个URL,服务器不会使用URL回复。但它可以回应各种各样的反应。例如,如果您希望客户端向特定网址发出新请求,那就是重定向:

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

但是,如果确实希望使用内容进行回复

return View(vm);

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

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

答案 1 :(得分:0)

重定向到主页索引操作。

如果您在家庭控制器内,请执行以下操作:

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 Action:

<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道歉...