2017-08-25 22 views
0

ActionControllerのPOST時にオブジェクトのオブジェクトのインスタンスに設定されていない大きなole 'オブジェクト参照を受信して​​います。POSTのViewModelのASP.NET MVC - Nullオブジェクト

基本的に、私はuserRequestのIDをrequestResponseと共に保存する必要があります。 (外来キーはこちら)

ここはコードです。

のViewModel:

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オブジェクトがPOSTメソッドのビューモデルパラメータのNULLでデバッグモードを使用したが、FINE requestResponseです必要に応じて入力します。

これを検索すると、ほとんどのビューモデルの命名規則に問題があるように見えましたが、そこに矛盾がないことを確認しました。 HTML入力要素を作成しません言及してくださいこのワークフローを行うには、より明確な方法...

+0

エラーのスタックトレースを投稿できますか。 –

答えて

1

@Html.DisplayForが、リテラル単純な文字列がある場合は

(ほとんどの種類のために、いくつかの例外は、ドキュメントに記載されています: 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()フィールドを一致させる必要があることに気づいた、またはモデル状態はもはや有効ではありません。 –

関連する問題