在HttpPost中将对象传递回视图

时间:2009-09-07 10:09:59

标签: asp.net-mvc

我会说得很简单,这是我得到的代码。

  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对象返回到视图。

固定

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

这两个字段实际上都没有放在页面中的表单元素中,因此没有任何内容被回发。很高兴知道。

2 个答案:

答案 0 :(得分:1)

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

另一个选择是只将ID传递给删除操作使用FetchNonCIStaffUserByID填充模型然后删除它当然会进行2分组调用。

答案 1 :(得分: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;
  //...
}

修改

抱歉,我很想念这个问题。你确定contractUser正在填充吗?您是否在调试时添加了断点以进行检查?它可能是您视图中的映射问题。