У меня есть что-то похожее на следующий метод:
public ActionResult Details(int id)
{
var viewData = new DetailsViewData
{
Booth = BoothRepository.Find(id),
Category = ItemType.HotBuy
};
return View(viewData);
}
и следующий маршрут:
routes.MapRoute("shows","shows/{controller}/{action}/{id}", new {id = 0});
Все работало нормально до бета-версии, когда у меня был Preview 3. Теперь метод правильно заполнит идентификатор при первом выполнении действия. Однако во второй раз контроллер ModelState
содержит значение идентификатора последнего использования. Это заставляет ActionInvoker
использовать его в параметре метода вместо значения Route
.
Итак, если я дважды назову действие для двух разных сущностей, результат будет таким:
www.mysite.com/shows/Booth/Details/1 => Details(1)
www.mysite.com/shows/Booth/Details/2 => Details(1) //from ModelState["id"]
Из моего быстрого сканирования с помощью Reflector кажется, что сначала он привязывает параметры к ModelState, а затем к Routes. Тем не менее, я никогда не публиковал ничего от модели. Насколько я могу сказать, ModelState не должен содержать ничего.
Это ошибка в бета-версии, возможно, ошибка где-то в моем коде, или есть какая-то особенность дизайна, о которой я не знаю? Любое понимание природы ModelState и причин, по которым это происходит, приветствуется.
EDIT:
Я обнаружил, что эта проблема на самом деле является признаком того, что кажется ошибкой в DefaultValueProvider, если вы создаете экземпляр Controller из контейнера IoC, который существует на протяжении всего времени жизни приложения Asp.Net. В этом случае DefaultValueProvider использует первый ControllerContext передается контроллеру и никогда не обновляет его, пока контроллер не будет воссоздан. Это приводит к тому, что старые данные RouteData используются для параметров метода вместо текущих данных RouteData.