Изменено ли ToValueProvider () в ASP.NET MVC2? - PullRequest
1 голос
/ 13 апреля 2010

Я применил примеры кодов с книгой 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();
        }
    }

Но когда я попытался заполнить форму заказа в браузере, она показала следующее сообщение об ошибке:

Значение не может быть нулевым или пустым. Имя параметра: имя Описание: во время выполнения текущего веб-запроса произошло необработанное исключение. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.

Сведения об исключении: System.ArgumentException: значение не может быть нулевым или пустым. Имя параметра: имя

Примеры кодов в книге основаны на ASP.NET MVC1, но я запускаю их на VS 2010 с ASP.NET MVC 2. И, похоже, произошли некоторые изменения в методе ToValueProvider ().

Как я могу исправить эту проблему и заставить приложение mvc нормально работать? Большое спасибо.

Ответы [ 2 ]

1 голос
/ 28 августа 2010

Я работал над той же книгой (Pro ASP.Net MVC Framework) и решил эту проблему, выполнив следующие действия перед моим вызовом CheckOut:

controller.ControllerContext = new ControllerContext();

Я довольно новичок в MVC и тестировании, поэтому я не совсем уверен, почему ControllerContext был нулевым, но это сделает мои тесты успешными.

1 голос
/ 03 июня 2010

Я получил то же исключение, когда экспериментировал с различными методами привязки данных в 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...