Как перенаправить на индекс с другого контроллера?

#c# #asp.net-mvc

#c# #asp.net-mvc

Вопрос:

Я просматривал, пытаясь найти какой-нибудь способ перенаправить на Index представление с другого контроллера.

 public ActionResult Index()
{                
     ApplicationController viewModel = new ApplicationController();
     return RedirectToAction("Index", viewModel);
}
  

Это то, что я пробовал прямо сейчас. Теперь код, который мне дали, имеет ActionLink ссылку на страницу, которая мне Redirect тоже нужна.

 @Html.ActionLink("Bally Applications","../Application")
  

Ответ №1:

Используйте перегрузки, которые также принимают имя контроллера…

 return RedirectToAction("Index", "MyController");
  

и

 @Html.ActionLink("Link Name","Index", "MyController", null, null)
  

Комментарии:

1. Хорошо, это сработало. Я пробовал это раньше, должно быть, была опечатка, когда я делал это раньше.

2. это было бы раньше, но меня останавливал таймер

3. Ах, для нас, новичков в MVC, это было чрезвычайно полезно. Я просто перенаправлял на другое представление в другую папку, представленную другим контроллером, пока не прочитал это.

4. как перенаправить на представление без контроллера? например Shared/Error

Ответ №2:

попробуйте:

 public ActionResult Index() {
    return RedirectToAction("actionName");
    // or
    return RedirectToAction("actionName", "controllerName");
    // or
    return RedirectToAction("actionName", "controllerName", new {/* routeValues, for example: */ id = 5 });
}
  

и в .cshtml поле зрения:

 @Html.ActionLink("linkText","actionName")
  

или:

 @Html.ActionLink("linkText","actionName","controllerName")
  

или:

 @Html.ActionLink("linkText", "actionName", "controllerName", 
    new { /* routeValues forexample: id = 6 or leave blank or use null */ }, 
    new { /* htmlAttributes forexample: @class = "my-class" or leave blank or use null */ })
  

Обратите внимание, что использование null в конечном выражении не рекомендуется, и лучше использовать пробел new {} вместо null

Комментарии:

1. Что касается вашего уведомления, по какой причине его лучше использовать new {} вместо null ?

Ответ №3:

Вы можете использовать следующий код:

 return RedirectToAction("Index", "Home");
  

См. RedirectToAction

Комментарии:

1. Я попробовал это, и это не сработало. Это дало мне ошибку page не удалось найти

2. должно быть с «Контроллером»: return RedirectToAction("Index", "Home");

3. Мне нужно использовать «/ Index», иначе не найден

4. @code4j как вы определили свои маршруты по умолчанию? Вы добавили значения по умолчанию для контроллера и действия?

Ответ №4:

Вы можете использовать метод overloads RedirectToAction(string actionName, string controllerName);

Пример:

 RedirectToAction(nameof(HomeController.Index), "Home");
  

Ответ №5:

Вы можете использовать локальное перенаправление. Следующие коды переходят на страницу индекса HomeController:

 public class SharedController : Controller
    {
        // GET: /<controller>/
        public IActionResult _Layout(string btnLogout)
        {
            if (btnLogout != null)
            {
                return LocalRedirect("~/Index");
            }

            return View();
        }
}
  

Ответ №6:

Полный ответ (.Net Core 3.1)

Большинство ответов здесь правильные, но взяты немного из контекста, поэтому я предоставлю полноценный ответ, который работает для Asp.Net Ядро 3.1. Для полноты картины:

 [Route("health")]
[ApiController]
public class HealthController : Controller
{
    [HttpGet("some_health_url")]
    public ActionResult SomeHealthMethod() {}
}

[Route("v2")]
[ApiController]
public class V2Controller : Controller
{
    [HttpGet("some_url")]
    public ActionResult SomeV2Method()
    {
        return RedirectToAction("SomeHealthMethod", "Health"); // omit "Controller"
    }
}
  

Если вы попытаетесь использовать любую из строк, специфичных для url, например "some_health_url" , это не сработает!

Ответ №7:

Помощники тегов:

 <a asp-controller="OtherController" asp-action="Index" class="btn btn-primary"> Back to Other Controller View </a>
  

В controller.cs есть метод:

 public async Task<IActionResult> Index()
{
    ViewBag.Title = "Titles";
    return View(await Your_Model or Service method);
}
  

Ответ №8:

RedirectToRoute() — еще один вариант. Просто передайте маршрут в качестве аргумента. Кроме того, использование nameof() может быть лучшим соглашением, поскольку вы не жестко кодируете имя контроллера в виде строки.

  return RedirectToRoute(nameof(HomeController)   nameof(HomeController.Index));