Je demande parce que je ne peux pas obtenir ce code pour travailler. Je reçois une exception; "Le modèle de type 'ITOC.WebUI.Models.Contract' n'a pas pu être mis à jour." Ce qui ne semble pas très utile.MVC 2 UpdateModel - comment ça marche?
** EDIT ** L'exception ci-dessus a été résolue en raison d'une faute d'orthographe dans le préfixe, une "chaîne magique" classique. Maintenant, le problème est que rien n'est mis à jour! ** END EDIT **
Je dois admettre que je ne suis pas clair comment UpdateModel fonctionne, et je ne suis pas clair comment fonctionne le préfixe. Le viewmodel est spécifié dans la page Web;
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master"
Inherits="System.Web.Mvc.ViewPage<ITOC.WebUI.Models.ContractViewModel>" %>
et la ViewModelClass est
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();
}
}
}
le contrôleur est;
[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();
}
avez-vous essayé ce que j'ai suggéré? – hunter
Oui, voir le commentaire sous votre nom. – arame3333
Je pense que le problème est le nom du préfixe. Le nom de la classe est "Contract", mais cela génère une exception, tout comme "contract". "Contrats" ne lance pas d'exception, mais n'est pas mis à jour non plus. – arame3333