2016-09-20 12 views
0

私はASP .Net Core 1.0が新しく、同じオブジェクトのコレクションを含むモデルにビューをバインドしようとしています。主なモデルはアンケートであり、さまざまな種類の質問が含まれています。しかし、私の問題はActionResultメソッドの中にあり、Listプロパティはポスト中に常にnullです。ASP .Net Coreモデルコレクションにバインドする

これは形式です:

<form id="mainForm" asp-controller="Default" asp-action="PersonalDetails" asp-route-sectionTypeCode="@Model.SectionTypeCode" asp-route-sectionNumber="@Model.SectionNumber" method="post" asp-anti-forgery="false"> 
     @{ 
      for (Int32 i = 0; i < Model.Questions.Count; i++) 
      { 
       string spacerValue = ""; 
       if (i == Model.Questions.Count - 1) 
       { 
        spacerValue = "extraLargeSpacerBottom"; 
       } 
       <div class="form-group @spacerValue"> 
        <label>@Model.Questions[i].QuestionTitle</label> 
        @{ 
         switch (Model.Questions[i].QuestionTypeCode) 
         { 
          case 1: 
           <input asp-for="Questions[i].Value" class="form-control appInput" type="text"> 
           break; 

          case 2: 
           <input asp-for="Questions[i].Value" class="form-control appInput" type="number"> 
           break; 

          case 3: 
           <select asp-for="Questions[i].Value" class="form-control appInput" asp-items="Model.Questions[i].QuestionOptions"></select> 
           break; 

          case 4: 
           <input asp-for="Questions[i].Value" class="form-control appInput" type="date"> 
           break; 

          case 5: 
           <div> 
            <label class="radio-inline"> 
             <input asp-for="Questions[i].Value" value="true" type="radio"><span class="radioSpace">Yes</span> 
            </label> 
            <label class="radio-inline"> 
             <input asp-for="Questions[i].Value" value="false" type="radio"><span class="radioSpace">No</span> 
            </label> 
           </div> 
           break; 

          case 6: 
           <input asp-for="Questions[i].Value" class="form-control appInput" type="number"> 
           break; 
         } 
        } 
       </div> 
      } 
     } 
    </form> 

そして、これは_Questionクラスです:

public class _Question 
{ 
    #region Properties 
    public string QuestionTitle { get; private set; } 
    public string QuestionHelp { get; private set; } 
    public Int32 QuestionTypeCode { get; private set; } 
    public string ValidationMessage { get; private set; } 
    public List<SelectListItem> QuestionOptions { get; private set; } 

    public dynamic Value { get; set; } 
    #endregion 

    public _Question() { } 

    public _Question(Int32 questionTypeCode, string questionTitle, string questionHelp, List<SelectListItem> options = null) 
    { 
     QuestionTypeCode = questionTypeCode; 
     QuestionTitle = questionTitle; 
     QuestionHelp = questionHelp; 
     QuestionOptions = options; 

     switch (questionTypeCode) 
     { 
      case 1: 
       ValidationMessage = "Please enter a text value"; 
       break; 

      case 2: 
       ValidationMessage = "Please enter a numeric value"; 
       break; 

      case 4: 
       ValidationMessage = "Please enter a date value"; 
       break; 

      case 6: 
       ValidationMessage = "Please enter a currency value"; 
       break; 
     } 
    } 
} 

メインモデルは、データベースから実行時に生成されている_Questionオブジェクトのリストが含まれています。

誰かが私のヌルの結果について私を助けてくれますか?

+0

を結合モデルについての詳細を見つけることができ、公開しなければなりませんか?はいの場合はそれに応じてマークしてください – MJK

答えて

0

コントローラはどのようにセットアップされていますか?モデルバインディングで行ったことから、コントローラは、ポストデータを受け入れるためのモデル(またはビューモデル)と一致するように特定の方法を設定する必要があります。基本的には、モデル内のすべてがポストデータの名前と正確に一致するようにします。例えば

ビューモデル:

public class ExampleCustomerViewModel 
{ 
    public string[] CustomerTypes { get; set; } 
    public bool Address { get; set; } 
    public bool City { get; set; } 
    public bool County { get; set; } 
    public bool ProvinceState { get; set; } 
    public bool Country { get; set; } 
    public bool PostalZip { get; set; } 
} 

そしてコントローラ:

[HttpPost] 
    public IActionResult ExampleAction(ExampleCustomerViewModel viewModel) 
    { 
     if (!ModelState.IsValid) 
      return BadRequest(); 

     viewModel.DoWhatever(); 

     return PartialView("~/Sites/ExampleCustomer.cshtml", viewModel); 
    } 

そして、私はいくつかのjQueryを使用:

 function performCustomerInitialization() { 

    //Dummy code where I am get the values I want from the form into JSON. 
       formParameters = { 
        CustomerTypes: customerTypes, 
        Address: $("#Address").prop("checked") === true, 
        City: $("#City").prop("checked") === true, 
        County: $("#County").prop("checked") === true, 
        ProvinceState: $("#ProvinceState").prop("checked") === true, 
        Country: $("#Country").prop("checked") === true, 
        PostalZip: $("#PostalZip").prop("checked") === true 

       }; 

      $.ajax({ 
       url: "ExampleAction", 
       type: "POST", 
       async: true, 
       data: formParameters, 
       dataType: "html", 
       success: function (results) { 
        $(resultsDiv).empty().append(results); 
        console.log(formParameters); 
       }, 
       error: function() { 
        $(resultsDiv).empty().append("<div class='box-body'><br/><p><em>An error occurred.</em></p><br/></div></div>"); 
       } 
      }); 
     } 

うまくいけば役立ちますあなたは里にいますghtの方向!

0

モデルバインディングはプライベートセットでは機能しません。 MVCはポストバックで

public class _Question 
{ 
    #region Properties 
    public string QuestionTitle { get; private set; } 
    public string QuestionHelp { get; private set; } 
    public Int32 QuestionTypeCode { get; private set; } 
    public string ValidationMessage { get; private set; } 
    public List<SelectListItem> QuestionOptions { get; private set; } 
    //... 
} 

を値を設定することができるようにセッターは、あなたの答えを見つけることがありますあなたはhere

関連する問題