我使用Pro ASP.NET MVC Framework一书应用了示例代码。
[AcceptVerbs(HttpVerbs.Post)]
public ViewResult CheckOut(Cart cart, FormCollection form)
{
if (cart.Lines.Count == 0)
{
ModelState.AddModelError("Cart", "Sorry, your cart is empty");
return View();
}
if (TryUpdateModel(cart.ShippingDetails, form.ToValueProvider()))
{
orderSubmitter.SubmitOrder(cart);
cart.Clear();
return View("Completed");
}
else
{
return View();
}
}
但是当我尝试在浏览器中填写订单时,它显示以下错误消息:
值不能为null或为空。 参数名称:名称 描述:执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。
异常详细信息:System.ArgumentException:Value不能为null或为空。 参数名称:名称
本书中的示例代码基于ASP.NET MVC1,但是我使用ASP.NET MVC 2在VS 2010上运行它们。它似乎是ToValueProvider()方法中的某种更改。
如何解决此问题并使mvc应用程序正常运行?非常感谢。
答案 0 :(得分:1)
当我在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 problem with UpdateModel
我下载了Mvc源代码并对其进行了调试。我发现controllerContext是NULL,导致上面的异常。为什么controllerContext是Null我不知道!
我尝试使用Mock对象在单元测试期间设置controllerContext,它工作正常。
[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);
我认为这是一个错误,因为我尝试使用将模型作为arg的行为进行默认绑定,并且行为正常:
public ActionResult FindPersonList(PersonList personList){....}
它工作正常。
但是我非常想了解将controllerContext设置为Null的内容。
答案 1 :(得分:1)
我正在阅读同一本书(Pro ASP.Net MVC Framework),并在致电CheckOut之前通过以下方式解决了这个问题:
controller.ControllerContext = new ControllerContext();
我对MVC和测试很新,所以我不确定为什么ControllerContext为null,但这会使我的测试通过。