我问,因为我无法使用此代码。 我得到一个例外; “无法更新'ITOC.WebUI.Models.Contract'类型的模型。” 这似乎没什么帮助。
**编辑** 由于前缀中的拼写错误(经典的“魔术字符串”),上述异常已得到解决。现在问题是没有得到更新! **结束编辑**
我必须承认我不清楚UpdateModel是如何工作的,我不清楚前缀是如何工作的。 视图模型在网页中指定;
<%@ 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 :(得分:3)
尝试在if / else语句中使用TryUpdateModel
if (TryUpdateModel(contract))
{
// save changes
}
else
{
// handle
}
TryUpdateModel
和UpdateModel
旨在用于合并具有已发布模型对象的对象。
更新指定的模型实例 使用控制器的值 当前价值提供者。
尝试阅读有关这两种方法的this post。
尝试更改您的帖子操作方法以匹配您的模型对象
[Authorize(Roles = "Inputter")]
[HttpPost]
public ActionResult Edit(ContractViewModel model)
{
//
}
如果您表单上的ID与ContractViewModel
对象的属性匹配,那么model
将使用这些值发布
答案 1 :(得分:1)
查看Controller.ModelState条目失败的内容。那将告诉你什么未能绑定。根据我的经验,它通常是数据类型不匹配。
CubanX的答案中的1和3对ModelBinding错误没有任何影响。 2可以忽略,因为如果你得到一个绑定错误,你知道它可能绑定,可能不必担心前缀。
答案 2 :(得分:0)
我注意到的一些事情:
您没有在视图中指定ViewModel。此处这一行表示没有特定类型模型的视图:
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>
在没有看到视图的情况下,我们无法确定您要在此处绑定的内容,或者即使您应该使用前缀。
您实际上并未将FormValues集合传递给UpdateModel。尝试:UpdateModel(contract, "Contract", formValues)