2010-08-19 62 views
1

我问,因为我不能让这个代码工作。 我收到一个异常; “无法更新'ITOC.WebUI.Models.Contract'类型的模型。” 这似乎不是很有帮助。MVC 2 UpdateModel - 它是如何工作的?

**编辑** 上述例外已解决,因为前缀中存在拼写错误,这是一种经典的“魔术字符串”。现在的问题是,没有得到更新! ** END编辑**

我不得不承认我不清楚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 2010-08-19 13:58:42

+0

是的,请参阅您的名下的评论。 – arame3333 2010-08-19 14:10:31

+0

我在想这个问题是前缀的名字。类的名称是“Contract”,但是会引发异常,就像“contract”一样。 “合同”不会引发异常,但不会更新。 – arame3333 2010-08-19 16:20:34

回答

3

尝试使用TryUpdateModel一个if/else语句

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

TryUpdateModelUpdateModel旨在用于合并的对象与发布模型对象。

更新使用来自控制器的 当前值提供程序的值指定的模型实例 。

尝试阅读this post有关这两种方法。


试着改变你的POST操作方法

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

匹配您的模型对象的表单匹配您ContractViewModel对象的属性标识的再model将这些值后

+0

是的,当我这样做时,其中一个对象属性返回一个空异常。这是否显示出问题所在,即使该字段不在表单中,我也必须使用必需的字段验证程序填充每个字段? – arame3333 2010-08-19 14:10:11

+0

如果您在使用您使用的ID的窗体上隐藏输入,则可以根据该ID加载该对象。然后调用UpdateModel(myloadedobject),它会合并提交页面上的项目,并忽略不属于的项目。 – hunter 2010-08-19 14:19:58

+0

我已将字段HiddenFor制作在我的表单上。但是,在Controller ModelView中,我仍然得到这些字段之一的空例外 – arame3333 2010-08-19 14:50:43

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 2010-08-19 13:31:02

+0

标记有一些有趣的地方。我试图编辑它,但在编辑视图中,标记是正确的! 所以你需要看到的是这个; <%@ Page Title =“”Language =“C#”MasterPageFile =“〜/ Views/Shared/Site.Master” Inherits =“System.Web.Mvc.ViewPage ”%> – arame3333 2010-08-19 13:31:22

+0

我在发现bug后编辑了问题... – arame3333 2010-08-19 13:54:39

1

查看Controller.ModelState条目失败的外观。这会告诉你未能绑定的东西。根据我的经验,通常它的数据类型不匹配。


CubanX的答案1和3对ModelBinding错误没有任何影响。 2可以忽略,因为如果你得到一个绑定错误,你知道它可能绑定,可能不必担心前缀。

+0

Controller.ModelState只包含ContractId。你认为这是问题吗? – arame3333 2010-08-19 13:39:32