Pytanie Przekieruj do działania według parametru mvc


Chcę przekierować do działania w innym kontrolerze, ale to nie działa oto mój kod w ProductManagerController:

[HttpPost]
public ActionResult RedirectToImages(int id)
{
    return RedirectToAction("Index","ProductImageManeger", new   { id=id   });
}

i to w moim ProductImageManagerController:

[HttpGet]
public ViewResult Index(int id)
{
    return View("Index",_db.ProductImages.Where(rs=>rs.ProductId == id).ToList());
}

Przekierowanie do ProductImageManager / Index bez parametru bardzo dobrze (brak błędu) ale z powyższym kodem otrzymuję to:

Słownik parametrów zawiera wpis o wartości null dla   parametr "ID" typu nieululującego "System.Int32" dla metody   "System.Web.Mvc.ViewResult Index (Int32)" w   "... Controllers.ProductImageManagerController".   Opcjonalnym parametrem musi być typ odwołania, typ null lub be   zadeklarowany jako parametr opcjonalny. Nazwa parametru: parametry


11
2017-11-12 13:04


pochodzenie


RedirectToImages nie może przekierować do ProductImageManager / Index z powodu nieprawidłowej kolejności parametrów - LINQ2Vodka
@jim Mam tylko jeden parametr, id, więc jaka jest tutaj kolejność parametrów? - Mohammadreza
Potrzeba "Index", "ProductImageManager" zamiast "ProductImageManager","Index" - LINQ2Vodka
jak public static void RegisterRoutes(RouteCollection routes) wygląda ciało metod? Dodaj do wiadomości - LINQ2Vodka
@jim w przekierowaniu Adres URL / ProductManager / Index zamiast / ProductManager / Index / 1, dlaczego mój parametr nie wysyła? - Mohammadreza


Odpowiedzi:


W przypadku przekierowania w tym samym kontrolerze nie trzeba określać kontrolera. Nie wiem, czy musisz mieć parametr nullable, aby wykonać to przekierowanie, czy też mamy go jako zerowalny, ponieważ musimy to zrobić w innej odsłonie, ale pochodzi to z działającego projektu:

[HttpGet]
public ActionResult EditRole(int? selectedRoleId)
{
    AddEditRoleViewModel role = _userService.GetAllRoles(selectedRoleId);
    return View(role);
}

[HttpPost]
public ActionResult EditRoleSave(AddEditRoleViewModel role)
{
    _userService.SaveRole(role);
    return RedirectToAction("EditRole", new { selectedRoleId = role.Id });
}

EDYTOWAĆ

Dzwoniąc do innego kontrolera, może być konieczne użycie klawisza a RouteValueDictionary:

return RedirectToAction("Index", new RouteValueDictionary( 
    new { controller = "ProductImageManager", action = "Index", id= id } ) 
);

Podany przykład powinien działać, jeśli twój RouteConfig jest skonfigurowany do tego, więc powinieneś to sprawdzić, aby poprawnie skonfigurować. Czek to pytanie stackoverflow i odpowiedzi, aby uzyskać więcej informacji.

EDYTUJ 2:

W komentarzu z @Mohammadreza błąd był w RouteConfig. Aby aplikacja obsługiwała adresy URL o identyfikatorze, musisz się upewnić, że jest skonfigurowana dla tej trasy. Robisz to w RouteConfig.cs zlokalizowany w App_Start teczka.

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    //adding the {id} and setting is as optional so that you do not need to use it for every action
    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}

15
2017-11-12 13:33



drodzy @Binke ich nie to samo. productManger i productImageManger. mój błąd polegał na konfiguracji w routConfig. wspominam o tym w komentarzu do pytania. jakikolwiek sposób tnx za twoją pomoc :) - Mohammadreza
Możesz po prostu użyć RedirectToAction do tego. Nie potrzebujesz słownika wartości trasy. - vohrahul


To powinno działać!

[HttpPost]
public ActionResult RedirectToImages(int id)
{
    return RedirectToAction("Index", "ProductImageManeger", new  { id = id });
}

[HttpGet]
public ViewResult Index(int id)
{
    return View(_db.ProductImages.Where(rs => rs.ProductId == id).ToList());
}

Zauważ, że nie musisz przekazywać nazwy widoku, jeśli zwracasz ten sam widok, jaki został zaimplementowany przez akcję.

Twój widok powinien dziedziczyć model w następujący sposób:

@model <Your class name>

Następnie uzyskasz dostęp do swojego modelu w widoku jako:

@Model.<property_name>

-1
2018-06-07 20:00



Nie, problemem jest routing ProductImageManagerController Index Action. - Mohammadreza
Czy możesz wkleić kod app.routes tutaj jako część pytania? Ponieważ działa. Nie wiem, dlaczego obniżyłeś cenę! - vohrahul


Spróbuj tego,

return RedirectToAction("ActionEventName", "Controller", new { ID = model.ID, SiteID = model.SiteID });

Tutaj wspomnę, że przekazujesz wiele wartości lub model również. Dlatego tu o tym wspominam.


-2
2017-11-12 13:10



Gdzie był SiteID pochodzić z? - Mike Perrenoud


return RedirectToAction("ProductImageManager","Index", new   { id=id   });

Oto niepoprawna kolejność parametrów, powinna to być pierwsza czynność
I
upewnij się, że twój stół routingu jest poprawny


-3
2017-11-12 13:06



To dokładnie ten sam kod, który ma OP. - Mike Perrenoud
I to nie robi nic dobrego. Napraw odpowiedź i pozbywam się mojego upadłego. - Mike Perrenoud
@MichaelPerrenoud obniżyłeś swoją karmę :) - LINQ2Vodka
LOL, rozpuść mnie. - Mike Perrenoud
drodzy @jim To bez przekierowania parametru do ProductImageManager / Index. Jestem zdezorientowany. - Mohammadreza