2017-08-25 54 views
0

在ActionController开机自检后,我收到对象引用未设置为对象错误的实例的大对象'ASP.NET MVC - POST中的ViewModel中的空对象

基本上我需要使用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之间..

,最后是邮政的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")); 
     } 
    } 

使用调试模式userRequest对象是NULL在POST方法的视图模型参数,但requestResponse则是罚款并按照应该填充。

在此查找它似乎最有问题的视图模型中的命名约定,但我已确保没有差异。

如果有一个更清晰的方式来做到这一点的工作流程请注明..

+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)。

+0

很好的答案,清晰的解释和链接到更多的信息。添加HiddenFor工作正常。我注意到我必须使用我在控制器中检索的GET方法字段来匹配hiddenFor()字段,否则我的模型状态不再有效。 –

相关问题