2009-09-07 86 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

相關問題