У меня есть что-то похожее на следующий метод:
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. Теперь метод будет корректно заполнять id при первом выполнении действия. Однако во второй раз 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 и того, почему это происходит.
РЕДАКТИРОВАТЬ: я обнаружил, что эта проблема на самом деле является симптомом того, что кажется ошибкой с DefaultValueProvider, если вы создаете экземпляр контроллера из контейнера IoC, который существует на протяжении всего времени существования приложения Asp.Net. Что происходит, так это то, что DefaultValueProvider использует Первый ControllerContext передается контроллеру и никогда не обновляет его до тех пор, пока контроллер не будет воссоздан. Это приводит к тому, что старые RouteData используются для параметров метода вместо текущих RouteData.