System.Web.Mvc.dll中出现System.ArgumentNullException

时间:2017-11-15 02:25:54

标签: c# asp.net-mvc

我有一个应用程序,我需要输入数据,然后提交数据保存在数据库中。当我在数据库中签入时,输入已成功保存,但在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);

        }

例外快照: enter image description here

1 个答案:

答案 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> 
}