我有一个应用程序,我需要输入数据,然后提交数据保存在数据库中。当我在数据库中签入时,输入已成功保存,但在httppost之后重新加载页面时出现异常。 我在以下方面遇到例外:
@Html.DropDownList("LineID", new SelectList(Model.dropConfig, "LineID", "LineID"), "-- Select LineID --", new { required = true, @class = "form-control" })
控制器代码获取下拉列表值,与Db绑定:
[ActionName("DetailsForm")]
[HttpGet]
public ActionResult DetailsForm()
{
try
{
var model = new DetailsViewModel() { dropConfig = floorService.DropDownList().ToList() };
return View("DetailsForm", model);
}
catch (Exception ex)
{
return View("_error");
}
}
控制器代码到http post:
[ActionName("DetailsForm")]
[HttpPost]
public ActionResult DetailsForm(DetailsViewModel model, FormCollection form)
{
DetailsConfiguration detailsConfig = new DetailsConfiguration();
detailsConfig.LineID = Convert.ToString(form["LineID"]);
//Similary for other fields
floorService.SaveDetails(detailsConfig);
ModelState.Clear();
ViewBag.message = "Success";
return View("DetailsForm",model);
}
答案 0 :(得分:1)
因为您的视图代码使用Model.dropConfig
为您的下拉列表构建SelectList
,并且您在返回视图之前未设置dropConfig
属性值。
请记住, Http是无状态的。因此,即使您在GET操作中设置了dropConfig属性值,它也不会在您的HttpPost操作中可用。提交表单时,这是对服务器的全新请求。
您可以通过再次加载dropConfig
属性来修复它。
model.dropConfig = floorService.DropDownList().ToList();
return View(model);
但理想情况下,您应该关注P-R-G pattern 。
P-R-G代表发布 - 重定向 - 获取。因此,当您将表单提交给http post action方法时,您应该返回重定向响应,浏览器将对该操作方法进行新的GET调用。
您可以使用RedirectToAction
方法返回重定向响应。
floorService.SaveDetails(detailsConfig);
return RedirectToAction("DetailsForm");
这会将302响应发送回浏览器,并将位置标头设置为DetailsForm
操作方法的网址,浏览器将向该网站发出新的GET请求。
使用重定向响应时,ViewBag无法正常工作。所以你可以考虑使用TempData。 TempData可用于在两个请求之间进行传输。
TempData["message"] = "Success";
return RedirectToAction("DetailsForm");
现在,您可以在DetailsForm操作方法或由其呈现的视图中阅读TempData["message"]
。
例如,您可以在视图中阅读(由DetailsForm GET操作方法呈现),就像这样
@if (TempData["message"]!=null)
{
<div class="alert alert-success" id="alert">
<button type="button" class="close" data-dismiss="alert">x</button>
<strong>Success! </strong>@TempData["message"]
</div>
}