Перенаправление с маршрута MVC без ввода нового контроллера? - PullRequest
0 голосов
/ 30 мая 2018

Учитывая маршрут MVC:

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

В настоящее время браузер отображает /user/2, однако я хочу "перенаправить" на /, удалив слаг.Я говорю «перенаправить», потому что я не хочу перенаправлять;Я хочу выполнить работу в пределах GetUser и вернуть ответ, который говорит браузеру соответствующим образом изменить отображаемый URL.Это возможно?

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Перенаправление на индекс Home Home.

Если вы находитесь в 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 ...

0 голосов
/ 30 мая 2018

возвращает ответ, который говорит браузеру соответственно изменить отображаемый URL-адрес

Это не так, как работают HTTP-запросы / ответы.Клиент запрашивает URL, сервер не отвечает URL.Но он может ответить различными ответами.Например, если вы хотите, чтобы клиент отправил новый запрос на определенный URL, это перенаправление:

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

Однако, если вы действительно хотите, чтобы ответьте content :

return View(vm);

Тогда вашему content потребуется сделать что-то, что изменит URL.Это будет в коде на стороне клиента .Я не ожидал бы, что это будет на 100% надежно, и меня не удивит, если некоторые браузеры (или некоторые настройки браузера) сочтут это потенциальной фальсификацией безопасности и не допустят ее.

Между этими двумя подходами наиболее распространенным является первый.Но операция, которую вы показываете в своем коде, кажется, не гарантирует этого.Если вы намереваетесь показать информацию о пользователе (или любую запись в данных) из корня сайта, не требуя, чтобы клиент перешел на URL, который его запрашивает, возможно, вы хотите, чтобы корень вашего сайта сделал запрос AJAX длявместо данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...