Перенаправление в действие с помощью параметра 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   });

Вот некорректный порядок параметров, должен быть первым действием И
убедитесь, что таблица маршрутизации верна.