2017-08-25 73 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()字段,否則我的模型狀態不再有效。 –

相關問題