Я получил то же исключение, когда экспериментировал с различными методами привязки данных в MVC 2.0.
Мой метод действия:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult FindPersonList(FormCollection form)
{
PersonList personList = new PersonList();
if (TryUpdateModel(personList, form.ToValueProvider()))
{
//....Do something
}
else
{
Add Error message
return View("SubmittedView");
}
return View("GoNextView");
}
Представление содержит только простые полосы, и они не равны NULL.
Исключение:
System.ArgumentException was unhandled by user code
Message="Value cannot be null or empty.
Parameter name: name"
Source="System.Web.Mvc"
ParamName="name"
StackTrace:.....
Я последовал предложению по этой ссылке:
ASP.NET MVC 2 проблема с UpdateModel
Я скачал исходный код Mvc и отладил его. Я обнаружил, что controllerContext имеет значение NULL, что вызывает указанное выше исключение. Почему controllerContext имеет значение Null, я не знаю!
Я пытался установить controllerContext во время модульного теста с использованием объекта Mock, и он работал нормально.
[Test]
public void FindPersonListActionTest()
{
using (new SessionScope())//Related to ActiveRecord from Castle project ORM
{
FormCollection form = new FormCollection();
form.Add("BaseSearchKey", "Thabet");
form.Add("DepSearchKey", "Yourtan");
form.Add("name", "Some name");
controller.ControllerContext = new FakeControllerContext(controller);
Assert.IsNotNull(controller.HttpContext, "HttpContext is NULL");
Assert.IsNotNull(controller.ControllerContext, "ControllerContext is NULL");
var result = controller.FindPersonList(form) as ViewResult;
Assert.IsNotNull(result, "ViewResult is NULL");
var list = (PersonList)((ViewResult)result).ViewData.Model;
Assert.IsNotNull(list, "Controller Model is NULL");
}
}
То же исключение происходит при использовании UpdateModel:
UpdateModel(personList, form);
Я думаю, что это ошибка, потому что я пробовал привязку по умолчанию, используя действие, которое принимает модель в качестве аргумента и ведет себя нормально:
public ActionResult FindPersonList(PersonList personList){....}
И это отлично работает.
Однако я бы очень хотел понять, что было установлено для controllerContext равным Null.