【问题标题】:Is ToValueProvider() changed in ASP.NET MVC2?ASP.NET MVC2 中的 ToValueProvider() 是否更改?
【发布时间】:2010-04-13 03:43:58
【问题描述】:

我在 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();
        }
    }

但是当我尝试在浏览器中填写订单时,它显示以下错误消息:

值不能为空或空。 参数名称:名称 说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.ArgumentException:值不能为空或空。 参数名称:名称

书中的示例代码基于 ASP.NET MVC1,但我在 VS 2010 上使用 ASP.NET MVC 2 运行它们。它似乎是 ToValueProvider() 方法的某种变化。

如何解决这个问题,让mvc应用程序正常运行?非常感谢。

【问题讨论】:

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


    【解决方案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);
    


    我认为这是一个错误,因为我尝试使用将模型作为参数的操作进行默认绑定,并且行为正常:

    public ActionResult FindPersonList(PersonList personList){....}
    


    而且效果很好。

    不过,我非常想了解将 controllerContext 设置为 Null 的内容。

    【讨论】:

      【解决方案2】:

      我正在阅读同一本书(Pro ASP.Net MVC 框架)并通过在调用 CheckOut 之前执行以下操作解决了该问题:

      controller.ControllerContext = new ControllerContext();
      

      我对 MVC 和测试还很陌生,所以我不确定为什么 ControllerContext 为空,但这会让我的测试通过。

      【讨论】:

        猜你喜欢
        • 2010-11-24
        • 1970-01-01
        • 2011-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-13
        • 2011-03-19
        相关资源
        最近更新 更多