MVC 2 UpdateModel - 它是如何工作的?

时间:2010-08-19 13:15:46

标签: asp.net-mvc

我问,因为我无法使用此代码。 我得到一个例外; “无法更新'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();
}

3 个答案:

答案 0 :(得分:3)

尝试在if / else语句中使用TryUpdateModel

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

TryUpdateModelUpdateModel旨在用于合并具有已发布模型对象的对象。

  

更新指定的模型实例   使用控制器的值   当前价值提供者。

尝试阅读有关这两种方法的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)

我注意到的一些事情:

  1. 您没有在视图中指定ViewModel。此处这一行表示没有特定类型模型的视图:

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

  2. 在没有看到视图的情况下,我们无法确定您要在此处绑定的内容,或者即使您应该使用前缀。

  3. 您实际上并未将FormValues集合传递给UpdateModel。尝试:UpdateModel(contract, "Contract", formValues)