ASP.NET MVC RedirectToAction передает неверное значение параметра? - PullRequest
4 голосов
/ 09 апреля 2009

Я использую ASP.NET MVC 1.0. У меня есть ActionResult, который получает форму сообщения со значением из выпадающего списка. Затем он перенаправляет в ActionResult, передавая значение в качестве параметра. Вот мои 2 метода ActionResult:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult FindPromo()
{
    var promoId = Convert.ToInt32(Request.Form["ddlPromotion"]);
    return RedirectToAction("GetPromo", new { id= promoId });
}

public ActionResult GetPromo(int id)
{

    if (promoId > 0)
    {
        var model = GetModel(id);

        if (model.Promo != null)
        {
            return View("Promo", GetModel(id));
        }
    }

    return RedirectToAction("NotFound");
}

Когда я отлаживаю это, значение из выпадающего списка правильно извлекается из моей формы, но при перенаправлении значение, отличное от предыдущего запроса, передается как значение promoId в методе GetPromo. Это происходит, даже если я полностью закрываю страницу и перезагружаю ее, почти как если бы она где-то кешировалась. Я знаю, что это что-то простое, но я никогда не сталкивался с этим раньше.

EDIT:

Я изменил имена параметров с promoId на id, а также обновил таблицу маршрутизации. Я обновил мой пример кода выше, и вот мои маршруты:

    routes.MapRoute("GetPromo", "{controller}/GetPromo/{id}",
        new { controller = "Promo", action = "GetPromo" });

    routes.MapRoute("FindPromo", "{controller}/FindPromo/{id}",
        new { controller = "Promo", action = "FindPromo" });

Однако я все еще получаю те же результаты с параметрами.

Ответы [ 4 ]

2 голосов
/ 05 мая 2009

Вы пытались использовать настройку маршрута по умолчанию: {controller} / {action} / {id}? Кроме того, это ваши единственные маршруты? Маршруты оцениваются по порядку, поэтому предыдущий маршрут может переопределить следующий, если он совпадает. Фил Хаак опубликовал отладчик маршрута в своем блоге на haacked.com

Вы также можете поиграть с: RouteTable.Routes.GetVirtualPath (), передав ViewContext.RequestContext и RouteValueDictionary и увидеть полученный URL.

1 голос
/ 05 мая 2009

Вы пробовали это?

return RedirectToAction("GetPromo", new { id = promoId.ToString() });

Я думаю, что мы столкнулись с подобной проблемой, и это решило проблему.

Если нет, вы можете сделать это:

var dict = new RouteValueDictionary();
dict.Add("id", promoId);

return RedirectToAction("GetPromo", dict);

И в качестве рекомендации не следует использовать Convert.ToInt32, вместо этого используйте int.Parse или int.TryParse.

1 голос
/ 09 апреля 2009

Интересно, связано ли это с вашей настройкой маршрутизации. Попробуйте переименовать promoId в id и обновить значения вашего маршрута. Если это не сработает, не могли бы вы обновить свой пост маршрутами.

0 голосов
/ 26 января 2010

Убедитесь, что ваш контейнер IOC не регистрирует ваши контроллеры как синглтоны. Я использую Виндзор, и стиль жизни по умолчанию - синглтон, и это вызывало «кэширование» поведения. См .: ASP.NET MVC - параметр контроллера не собирается из формы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...