2010-08-19 5 views
1

Я спрашиваю, потому что я не могу заставить этот код работать. Я получаю исключение; «Модель типа« ITOC.WebUI.Models.Contract »не может быть обновлена». Это не очень полезно.MVC 2 UpdateModel - как он работает?

** EDIT ** Вышеупомянутое исключение было разрешено из-за орфографической ошибки в префиксе, классической «Волшебной строкой». Теперь проблема в том, что НИЧЕГО НЕ ПОЛУЧАЕТСЯ ОБНОВЛЕНО! ** END EDIT **

Должен признаться, я не понимаю, как работает UpdateModel, и я не понимаю, как работает префикс. Viewmodel указан на веб-странице;

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" 
Inherits="System.Web.Mvc.ViewPage<ITOC.WebUI.Models.ContractViewModel>" %> 

и ViewModelClass является

public class ContractViewModel 
{ 
    //private ITOCEntities db = new ITOCEntities(); 
    public Contract contract { get; set; } 
    public IList<ContractType> contractTypes { get; set; } 
    public IEnumerable<SelectListItem> contractTypesSelectList 
    { 
     get 
     { 
      return this.contractTypes.Select(item => new SelectListItem 
      { 
       Text = item.ContractType1, 
       Value = item.ContractTypeId.ToString() 
      }); 
     } 
    } 


    public Contact clientContact { get; set; } 
    public Contact contractAdministratorContact { get; set; } 

    public ContractViewModel() 
    { 
     using (var db = new ITOCEntities()) 
     { 
      this.contractTypes = db.ContractTypes.ToList(); 

      this.clientContact = new Contact(); 
      this.contractAdministratorContact = new Contact(); 
      this.clientContact.ContactTypeId = 
       db.ContactTypes.Where(x => x.ContactType1 == "Client").SingleOrDefault().ContactTypeId; 
      this.contractAdministratorContact.ContactTypeId = 
       db.ContactTypes.Where(x => x.ContactType1 == "CA").SingleOrDefault().ContactTypeId; 
     } 
    } 
    public ContractViewModel(int contractId) 
    { 
     using (var db = new ITOCEntities()) 
     { 
      this.contractTypes = db.ContractTypes.ToList(); 
      this.contract = db.Contracts.Where(x => x.ContractId == contractId).SingleOrDefault(); 
      this.clientContact = 
       db.Contacts.Where(x => x.ContactId == this.contract.ClientContactId).SingleOrDefault(); 
      this.contractAdministratorContact = 
       db.Contacts.Where(x => x.ContactId == this.contract.ContractAdministratorContactId).SingleOrDefault(); 

     } 
    } 
} 

Контролер;

[Authorize(Roles = "Inputter")] 
[HttpPost] 
public ActionResult Edit(int contractId, FormCollection formValues) 
{ 
    if (ModelState.IsValid) 
    { 
     using (var db = new ITOCEntities()) 
     { 
      var contract = db.Contracts.Single(x => x.ContractId == contractId); 
      string letter = contract.ContractNo_Letter; 

      UpdateModel(contract, "Contracts"); 

      var clientContact = db.Contacts.Single(x => x.ContactId == contract.ClientContactId); 
      UpdateModel(clientContact, "Contact"); 
      var contractAdministrationContact = 
       db.Contacts.Single(x => x.ContactId == contract.ContractAdministratorContactId); 
      UpdateModel(contractAdministrationContact, "Contact"); 
      db.SaveChanges(); 
     } 

     return RedirectToAction("List"); 
    } 
    return View(); 
} 
+0

Вы попробовали то, что я предложил? – hunter

+0

Да, см. Комментарий под своим именем. – arame3333

+0

Я думаю, что проблема - это имя префикса. Название класса - «Контракт», но это исключает, как и «контракт». «Контракты» не вызывают исключения, но не обновляются. – arame3333

ответ

3

попробуйте использовать TryUpdateModel в если/другое заявлении

if (TryUpdateModel(contract)) 
{ 
    // save changes 
} 
else 
{ 
    // handle 
} 

TryUpdateModel и UpdateModel предназначены для использования в слияния объект с публикуемыми моделями объектом.

обновление указанная модель экземпляр с использованием значений от текущего поставщика значения контроллера.

Попробуйте прочитать this post об этих двух методов.


попытка изменения Опубликуйте Действие Методы, чтобы соответствовать вашей модели объекту

[Authorize(Roles = "Inputter")] 
[HttpPost] 
public ActionResult Edit(ContractViewModel model) 
{ 
    // 
} 

если идентификаторы на форме матча в свойства вашего ContractViewModel объекта, то model разместят с этими значениями

+0

Да, когда я делаю это, одно из свойств объекта возвращает нулевое исключение. это показывает, в чем проблема, что я должен заполнять каждое поле обязательным средством проверки поля, даже если это поле не в форме? – arame3333

+0

Если у вас есть скрытый ввод в форме с идентификатором, который вы используете, вы можете загрузить этот объект на основе этого идентификатора. Затем вызовите UpdateModel (myloadedobject), и он будет объединять элементы на представленной странице и игнорировать свойства, которых нет. – hunter

+0

Я создал поля HiddenFor на моей форме. Однако в Controller ModelView я по-прежнему получаю нулевое исключение для одного из этих полей – arame3333

0

Несколько замечаний, которые я сразу заметил:

  1. У вас нет ViewModel, указанного в вашем представлении. Эта линия означает здесь вид без какой-либо типа конкретной модели:

    <%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>

  2. Не видя взгляд, мы не можем быть уверены, что вы пытаетесь привязать сюда, или даже если вы должны использовать префикс.

  3. Вы фактически не проходите в коллекции FormValues ​​в UpdateModel.Попробуйте: UpdateModel(contract, "Contract", formValues)

+0

, там есть ViewModel – hunter

+0

В разметке есть что-то смешное. Я попытался отредактировать его, но в представлении редактирования разметка верна! Так что вам нужно это видеть; <% @ Название страницы = "" Язык = "C#" MasterPageFile = "~/Views/Shared/Site.Master" Inherits = "System.Web.Mvc.ViewPage "%> – arame3333

+0

Я только что редактировал вопрос после обнаружения ошибки ... – arame3333

1

Чтобы увидеть то, что не удалось посмотреть на ваши записи Controller.ModelState. Это скажет вам, что не удалось связать. По моему опыту, обычно это несоответствие типа данных.


1 и 3 ответа CubanX действительно не влияют на ошибки ModelBinding. 2 можно игнорировать, потому что, если вы получаете ошибку привязки, вы знаете, что она, вероятно, привязана и, вероятно, не стоит беспокоиться о префиксе.

+0

Controller.ModelState содержит только ContractId. Неужели это проблема, как вы думаете? – arame3333

Смежные вопросы