ASP.NET MVC - POST

时间:2017-08-25 21:28:31

标签: asp.net-mvc viewmodel nullreferenceexception

在ActionController发布后,我收到了未设置为对象错误的大型“对象引用”。

基本上我需要使用requestResponse保存userRequest的ID。 (外键在这里)

这是守则。

视图模型:

public class RequestResponseViewModel
{
    public Models.Request userRequest { get; set; }

    public Models.RequestResponse requestResponse { get; set; }

}

查看:在调试中,model.userRequest.ID中有值

    @model UserRequests.ViewModels.RequestResponseViewModel

  @{
    ViewBag.Title = "Create";
  }

  <h2>Admin Response to Request</h2>

  @using (Html.BeginForm())
  {
    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })
        <div class="form-group">
            @Html.LabelFor(model => model.requestResponse.Response, 
  htmlAttributes: new { @class = "control-label col-md-1" })
            <div class="col-md-10">
                @Html.TextAreaFor(model => model.requestResponse.Response, new { 
  @class = "form-control", @rows = 5 })
                @Html.ValidationMessageFor(model => 
  model.requestResponse.Response, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
              @Html.LabelFor(model => model.userRequest.ID, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-2">

                @Html.DisplayFor(model => model.userRequest.ID)             
                @Html.ValidationMessageFor(model => model.userRequest.ID, "", new { @class = "text-danger" })
            </div>
            @Html.LabelFor(model => model.requestResponse.Author, htmlAttributes: new { @class = "control-label col-md-1" })
            <div class="col-md-3">
                @Html.EditorFor(model => model.requestResponse.Author, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.requestResponse.Author, "", new { @class = "text-danger" })
            </div>
            @Html.LabelFor(model => model.requestResponse.CreateDate, htmlAttributes: new { @class = "control-label col-md-1" })
            <div class="col-md-3">
                <h5>@DateTime.Now</h5>
                @Html.ValidationMessageFor(model => model.requestResponse.CreateDate, "", new { @class = "text-danger" })
            </div>
        </div>



        <div class="form-group">
            <div class="col-md-offset-1">
                <button type="reset" class="btn btn-default">Cancel</button>
                <input type="submit" value="Create" class="btn btn-success" />
            </div>
        </div>
    </div>

    <hr />
    <h3 class="text-success">Original Request</h3>
    <div class="row">
        <div class="col-md-10">
          <h4>@Html.DisplayFor(model => model.userRequest.Title)</h4>
        </div>
    </div>

    <div class="row">
        <div class="col-md-10">
            <h4>@Html.DisplayFor(model => model.userRequest.Description)</h4>
        </div>
    </div>

    }

    <div>
      @Html.ActionLink("Back to Browse", "Browse","Change")
    </div>

获取ActionResult:

public ActionResult Create(int id)
    {


        UserRequestContextDataContext db = new UserRequestContextDataContext();
        var request = (from m in db.Requests
                       where m.ID == id
                       select new Models.Request()
                       {

                           ID = m.ID,
                           Title = m.Title,
                           Description = m.Description,
                           BusinessUnit = m.BusinessUnit,
                           Author = m.Author,
                           ModuleName = m.MenuItem,
                           RequestStatus = 2,
                           SubmitDate = m.SubmitDate,
                           Type = m.Type,
                           UrgencyNum = m.UrgencyLevel


                       }).FirstOrDefault();

        var reqResponse = new Models.RequestResponse();


        var viewModel = new RequestResponseViewModel
        {
            userRequest = request,
            requestResponse = reqResponse

        };

        return View(viewModel);
    }

这里的“viewModel”拥有我需要的一切。它在ActionResults之间丢失了。

最后是Post ActionResult:

 [HttpPost]
    public ActionResult Create(RequestResponseViewModel _requestResponseViewModel) 
    {
        try
        {

            if (ModelState.IsValid)
            {
                using (UserRequestContextDataContext db = new UserRequestContextDataContext())
                {

                    RequestResponse reqRes = new RequestResponse();
                    reqRes.Response = _requestResponseViewModel.requestResponse.Response.ToString();

                    reqRes.RequestID = _requestResponseViewModel.userRequest.ID;
                    reqRes.Author = _requestResponseViewModel.requestResponse.Author.ToString();
                    reqRes.CreateDate = DateTime.Now;

                    db.RequestResponses.InsertOnSubmit(reqRes);
                    db.SubmitChanges();
                }
            }

            return RedirectToAction("Browse","Change");
        }
        catch (Exception ex)
        {

            return View("Error", new HandleErrorInfo(ex, "Change", "Create"));
        }
    }

使用调试模式,POST方法的视图模型参数中的userRequest对象为 NULL ,但requestResponse为FINE并按原样填充。

在搜索时,似乎大多数视图模型中的命名约定存在问题,但我确保那里没有差异。

如果有更清晰的方法来完成此工作流程,请提及..

2 个答案:

答案 0 :(得分:1)

@Html.DisplayFor不会创建HTML输入元素,而是创建一个简单的字符串文字(对于大多数类型,文档中列出了一些例外:https://msdn.microsoft.com/en-us/library/ee407420(v=vs.118).aspx#Anchor_1)。 因此,当您按提交时,您的浏览器将不会将ID发送回服务器,因为它仅发送表单数据(例如来自输入,文本,选择字段的数据)。使用浏览器开发人员工具(F12),您可以检查实际发送到服务器的内容。

您可以使用@Html.HiddenFor(model => model.userRequest.ID)添加隐藏的输入字段,或使用ID的自定义显示模板自动添加隐藏的输入字段。您可以进一步使用UIHint属性来自动选择显示模板。这两种方法都有完整的文件记录(例如http://www.codeguru.com/csharp/.net/net_asp/mvc/using-display-templates-and-editor-templates-in-asp.net-mvc.htm)。

答案 1 :(得分:0)

对象在POST中可能为NULL的另一个原因是由于忘记添加设置器{get;组; }在您的视图模型中:

公共秩序订单; ->缺少{get;组; }

{
  "body": {
     "contentType": "HTML",
     "content": "<html>\r\n<head>\r\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\r\n<meta content=\"text/html; charset=us-ascii\">\r\n</head>\r\n<body>\r\ntest\r\n</body>\r\n</html>\r\n"
  }
}