Jak przekierować do indeksu z innego kontrolera?

129

Przeglądałem, próbując znaleźć sposób na przekierowanie do Indexwidoku z innego kontrolera.

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

Właśnie tego próbowałem teraz. Teraz kod, który otrzymałem, ma ActionLinklink do strony, której potrzebuję Redirect.

@Html.ActionLink("Bally Applications","../Application")
cjohnson2136
źródło

Odpowiedzi:

272

Użyj przeciążeń, które pobierają również nazwę kontrolera ...

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

i

@Html.ActionLink("Link Name","Index", "MyController", null, null)
musefan
źródło
3
Ok, to zadziałało. Próbowałem tego wcześniej, co musiało być literówką, kiedy robiłem to wcześniej.
cjohnson2136,
2
zrobił to wcześniej, ale zatrzymał mnie licznik czasu
cjohnson2136
Ahh, dla nas, początkujących w MVC, było to niezwykle pomocne. Po prostu przekierowanie do innego widoku w innym folderze reprezentowanym przez inny kontroler otrzymywałem, dopóki tego nie przeczytałem.
atconway
jak przekierować do widoku bez kontrolera? takie jakShared/Error
Dylan Czenski
28

próbować:

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

i na .cshtmlwidoku:

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

LUB:

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

LUB:

@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 */ })

Zauważ, że użycie nullw wyrażeniu końcowym nie jest zalecane i lepiej jest użyć spacji new {}zamiastnull

ravy amiry
źródło
3
Jeśli chodzi o twoje zawiadomienie, z jakiego powodu lepiej jest go używać new {}zamiast null?
musefan
16

Możesz użyć następującego kodu:

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

Zobacz RedirectToAction

Wouter de Kort
źródło
Próbowałem tego i nie udało się. Dał mi błąd nie można znaleźć strony
cjohnson2136
powinno być z „Kontrolerem”: return RedirectToAction("Index", "Home");
Hiraeth
W przeciwnym razie muszę użyć „/ Index”
code4j
@ code4j jak zdefiniowałeś swoje domyślne trasy? Czy dodano wartości domyślne dla kontrolera i akcji?
Wouter de Kort
2

Możesz użyć metody overloads RedirectToAction(string actionName, string controllerName);

Przykład:

RedirectToAction(nameof(HomeController.Index), "Home");
A. Lipnitskiy
źródło
1

Możesz użyć lokalnego przekierowania. Następujące kody przeskakują na stronę indeksu HomeControllera:

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

            return View();
        }
}
Hasan Tuna Oruç
źródło
0

Pełna odpowiedź (.Net Core 3.1)

Większość odpowiedzi tutaj jest poprawnych, ale trochę wyrwanych z kontekstu, więc podam pełną odpowiedź, która działa dla Asp.Net Core 3.1. Ze względu na kompletność:

[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"
    }
}

Jeśli spróbujesz użyć np. Ciągów znaków specyficznych dla adresu URL "some_health_url", to nie zadziała!

ワ イ き ん ぐ
źródło