是否在ASP.NET MVC2中更改了ToValueProvider()?

时间:2010-04-13 03:43:58

标签: asp.net-mvc asp.net-mvc-2

我使用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应用程序正常运行?非常感谢。

2 个答案:

答案 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,但这会使我的测试通过。