Перенаправление в действие с помощью параметра mvc
Я хочу перенаправить на действие в другом контроллере, но здесь не работает мой код в ProductManagerController:
[HttpPost]
public ActionResult RedirectToImages(int id)
{
return RedirectToAction("Index","ProductImageManeger", new { id=id });
}
и это в моем ProductImageManagerController:
[HttpGet]
public ViewResult Index(int id)
{
return View("Index",_db.ProductImages.Where(rs=>rs.ProductId == id).ToList());
}
Он перенаправляет на ProductImageManager/Index без параметров очень хорошо (без ошибок), но с приведенным выше кодом я получаю это:
Словарь параметров содержит пустую запись для параметра 'ID' ненулевого типа 'System.Int32' для метода 'System.Web.Mvc.ViewResult Index (Int32)' в '... Controllers.ProductImageManagerController'. Необязательный параметр должен быть ссылочным типом, обнуляемым типом или быть объявлен как необязательный параметр. Имя параметра: параметры
Ответы
Ответ 1
Эта ошибка очень неописательная, но ключ здесь в том, что "ID" находится в верхнем регистре. Это указывает на то, что маршрут не был правильно настроен. Чтобы приложение могло обрабатывать URL-адреса с идентификатором, необходимо убедиться, что для него настроен хотя бы один маршрут. Вы делаете это в RouteConfig.cs, расположенном в папке App_Start. Наиболее распространенным является добавление идентификатора в качестве необязательного параметра к маршруту по умолчанию.
public static void RegisterRoutes(RouteCollection routes)
{
//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 }
);
}
Теперь вы сможете перенаправить на свой контроллер так, как вы его настроили.
[HttpPost]
public ActionResult RedirectToImages(int id)
{
return RedirectToAction("Index","ProductImageManager", new { id });
//if the action is in the same controller, you can omit the controller:
//RedirectToAction("Index", new { id });
}
В одном или двух случаях назад я столкнулся с некоторыми проблемами при обычном перенаправлении и вынужден был сделать это, передав RouteValueDictionary. Больше информации о RedirectToAction с параметром
return RedirectToAction("Index", new RouteValueDictionary(
new { controller = "ProductImageManager", action = "Index", id = id } )
);
Если вы получаете очень похожую ошибку, но в нижнем регистре 'id', это обычно происходит потому, что маршрут ожидает параметр id, который не был предоставлен (вызывая маршрут без id /ProductImageManager/Index
). Смотрите этот вопрос для получения дополнительной информации.
Ответ 2
Это должно работать!
[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());
}
Обратите внимание, что вам не нужно передавать имя представления, если вы возвращаете то же представление, которое реализовано действием.
Ваша точка зрения должна наследовать модель следующим образом:
@model <Your class name>
Затем вы можете получить доступ к вашей модели в виде:
@Model.<property_name>
Ответ 3
Попробуйте это,
return RedirectToAction("ActionEventName", "Controller", new { ID = model.ID, SiteID = model.SiteID });
Здесь я упоминаю, что вы также передаете несколько значений или модель.
Вот почему я упоминаю это.
Ответ 4
return RedirectToAction("ProductImageManager","Index", new { id=id });
Вот некорректный порядок параметров, должен быть первым действием
И
убедитесь, что таблица маршрутизации верна.