2009-09-07 38 views
0

我将简化它,下面是我得到的代码。将对象传递给HttpPost中的视图

public ActionResult DeleteNonCIStaffUser(int id) 
    { 
    return View(_contractsControlRepository.FetchNonCIStaffUserByID(id)); 
    } 

    [HttpPost] 
    public ActionResult DeleteNonCIStaffUser(ContractUser contractUser) 
    { 
    try 
    { 
     _contractsControlRepository.DeleteNonCIStaffUser(contractUser.User_Key); 
     return RedirectToAction("NonCIStaffUsers"); // never reaches this as an exception is thrown! 
    } 
    catch 
    { 
     ViewData["ExceptionMessage"] = "Exception caught!"; 
     return View(contractUser); // I'm expecting this statement to return the ContractUser object instantiated with the same data as the GET action. 
    } 
    } 

HttpPost包含ContractUser对象。回发后,我没有任何东西,contractUser对象不再存在,我觉得很奇怪。 FetchNonCIStaffByUser(int)带回一个ContractUser对象(它工作)。删除页面显示来自此对象的信息,因此我知道初始条目可以工作,如果发生错误,则只是回发,而不会显示ContractUser对象的信息。

任何想法为什么会发生这种情况?我期望contractUser对象被返回到视图。

FIXED

<%= Html.Hidden("FullName", Model.FullName) %> 
<%= Html.Hidden("User_Key", Model.User_Key) %> 

既不领域实际上被放在页面的表单元素,因此没有被调回。很高兴知道。

回答

1

当调用DeleteNonCIStaffUser操作时,将从请求填充contractUser对象(假设您使用默认模型绑定器),因此属性将自动与请求中找到的信息绑定。这意味着您在调用删除操作时需要传递contractUser的所有值(您可以将它们存储在页面中的隐藏字段中)。

另一种选择是将ID传递给删除操作,使用FetchNonCIStaffUserByID来填充模型,然后删除它,这当然会造成2 db调用。

+0

Doh,对不起,这是正确的。看到我的修复,你是对的。 – Kezzer 2009-09-07 12:57:47

0

重定向到“NonCIStaffUsers”操作时,需要解析对象。您可以直接对其进行分析,如:

//... 
return RedirectToAction("NonCIStaffUsers", new { user = contractUser }); 
//... 

public ActionResult NonCiStaffUsers(ContractUser user) { 
    //... 
} 

或使用TempDataDictionary:

//... 
TempData["user"] = contractUser; 
return RedirectToUser("NonCIStaffUsers"); 
//... 

public ActionResult NonCiStaffUsers() { 
    ContractUser user = TempData["user"] as ContractUser; 
    //... 
} 

编辑

对不起,我missunderstood问题。你确定contractUser正在被正确填充吗?你是否在调试时添加了一个断点来检查它?在您看来,这可能是一个映射问题。

+0

它从来没有达到这个声明,因此我为什么在'return View(contractUser)中提到'contractUser';' – Kezzer 2009-09-07 10:35:53

+0

我已经用代码中的几条评论更新了我的文章,我知道它可能有点儿模糊。知道你可以通过RedirectToAction传递一个对象,这很方便。 – Kezzer 2009-09-07 10:39:02

+1

对不起,我错过了这个问题。你确定contractUser正在被正确填充吗?你是否在调试时添加了一个断点来检查它?在您看来,这可能是一个映射问题。 – 2009-09-07 11:18:29