Модель обновления ASP.NET MVC не работает? - PullRequest
2 голосов
/ 18 апреля 2011

Я хочу обновить сущность типа клиента.

[HttpPost]
public ActionResult Manage(String id, FormCollection collection)
{
    // Create service
    ClientService service = new ClientService();

    // Read existing client
    Client c = service.FindByUsername(id);

    // Update client by using values from submitted form collection
    UpdateModel(c, "Client");
    service.Update(c);

    return View(c);            
}

Служба возвращает сущность типа клиента.Клиент имеет следующие свойства: Имя пользователя, Имя, Фамилия, Идентификатор - это ключи в переданной коллекции.

Кроме того, у объекта клиента есть список заказов (добавленный SQL Metal), а также поле Версия дляотслеживание объекта.

При попадании в строку UpdateModel ошибки не возникает, но значения в объекте c не обновляются.Проблема не в service.Update(c), а в UpdateModel(c, "Client").

Что я делаю не так?

Спасибо

Редактировать: Клиент сопоставлен с металлом SQL.

Его атрибуты следующие:

  1. int Id
  2. Строка Имя пользователя;
  3. Строка Имя;
  4. Строка Фамилия;
  5. Версия отметки времени
  6. IQuerable Orders;

Ошибка (внутреннее исключение равно нулю)

System.InvalidOperationException was unhandled by user code
  Message=The model of type 'Shop.MVC.Data.Client' could not be updated.
  Source=System.Web.Mvc
  StackTrace:
       at System.Web.Mvc.Controller.UpdateModel[TModel](TModel model, String prefix, String[] includeProperties, String[] excludeProperties, IValueProvider valueProvider)
       at System.Web.Mvc.Controller.UpdateModel[TModel](TModel model)
       at Shop.MVC.Web.Controllers.ClientController.Manage(String id, FormCollection collection) in C:\Codebox\ARE002\VideoPlayerPrototype\Shop.MVC.Web\Controllers\ClientController.cs:line 45
       at lambda_method(Closure , ControllerBase , Object[] )
       at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters)
       at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
       at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
       at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass15.<InvokeActionMethodWithFilters>b__12()
       at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation)
  InnerException:

Ответы [ 4 ]

3 голосов
/ 18 апреля 2011

Проблема , скорее всего , заключается в том, что ни одно из свойств не начинается с "Client".

. Не зная деталей вашей модели, трудно сказать, но удалите "Client" иЯ считаю, что это должно решить проблему.


ОБНОВЛЕНИЕ

Вероятно, у вас есть некоторые правила проверки.Попробуйте использовать TryUpdateModel(), который не выполняет проверку на модели.

1 голос
/ 18 апреля 2011

Я бы согласился с Сергеем, что вам нужно позвонить Сохранить изменения, чтобы это сохранялось.Из вашего поста действий я не вижу нигде, где это сохраняется в БД.Вы просто вызываете UpdateModel, но я не вижу никаких сохраненных изменений.

Надеюсь, это поможет

0 голосов
/ 21 апреля 2011

Проблема была в структуре HTML - была вложенная форма, которая вызвала сбой метода UpdateModel, так как он содержал FormCollection для обеих форм.

0 голосов
/ 18 апреля 2011

Вам необходимо отправить изменения на ClientService

...