2016-08-18 37 views
2

我將viewModel從View1的HttpPost重定向到View2的HttpGet。 這工作沒有問題。 用戶必須接受條款和同意書。 這應該在viewModel中更改爲true(在它爲false之前)。 然後重定向到view2的HttpPost。在HttpPost操作方法中查看模型參數爲空

出現問題。 View2的HttpPost ActionResult收到所有參數爲NULL的視圖模型(在它們被填充之前)

我該如何解決這個問題?

這裏是我的HTTPGET的ActionResult爲視圖2:

public ActionResult Verify(QuestionViewModel viewModel) 
{ 
    //Anrede in Viewbag 
    if (viewModelVeri.Per_Salutation == 2) 
    { 
     ViewBag.Per_Salutation = "Frau"; 
    } 
    else 
    { 
     ViewBag.Per_Salutation = "Herr"; 
    } 

    int? per_region_id = viewModelVeri.Per_Region; 
    int per_region_id_nullable = Convert.ToInt32(per_region_id); 

    Region region = _repository.GetRegionById(per_region_id_nullable); 

    QuestionViewModel viewModel2 = new QuestionViewModel() 
    { 
     Reg_Name = region.Reg_Name 
    }; 

    //Regionsname in Viewbag 
    ViewBag.Reg_Name = viewModel2.Reg_Name; 

    return View(viewModel); 
} 

這是我的HttpPost的ActionResult爲視圖2:

[HttpPost] 
public ActionResult Verify(QuestionViewModel viewModel, string tbButton) 
{ 
    //here the ViewModel-Parameters are already NULL 

筆者認爲:

<div class="panel-body"> 

@using (Html.BeginForm("Verify", "QuestionForm", FormMethod.Post, new { id = "verifyform" })) 
{ 
@Html.AntiForgeryToken() 
    <div class="ctrl-row"> 
     <div class="form-group"> 
      <div class="container-fluid"> 
       @Html.LabelFor(model => model.Per_Salutation, new { @class = "control-label col-sm-1" }) 
       <div class="col-sm-3"> 
        @ViewBag.Per_Salutation 
        </div> 
      </div> 
     </div> 
    </div> 

    <div class="ctrl-row"> 
     <div class="form-group"> 
      <div class="container-fluid"> 
       @Html.LabelFor(model => model.Per_Name_Last, new { @class = "control-label col-sm-1" }) 
       <div class="col-sm-3"> 
        @Html.DisplayFor(model => model.Per_Name_Last, new { @class = "control-label col-sm-1 non-zero-num" }) 
       </div> 
       @Html.LabelFor(model => model.Per_Name_First, new { @class = "control-label col-sm-1" }) 
       <div class="col-sm-3"> 
        @Html.DisplayFor(model => model.Per_Name_First, new { @class = "control-label col-sm-1 non-zero-num" }) 
       </div> 
      </div> 
     </div> 
    </div 

    <div class="ctrl-row"> 
     <div class="form-group"> 
      <div class="container-fluid"> 
       @Html.LabelFor(model => model.Per_EMail, new { @class = "control-label col-sm-1" }) 
       <div class="col-sm-8"> 
        @Html.DisplayFor(model => model.Per_EMail, new { @class = "control-label col-sm-1 non-zero-num" }) 
       </div> 
      </div> 
     </div> 
    </div> 

    <div class="checkbox"> 
     <input type="checkbox" id="NutzungsbedingungenAngenommen " /> 
     <label for="NutzungsbedingungenAngenommen "> 
Ich erkläre mich mit den Nutzungsbedingungen einverstanden. 
     </label> 
    </div> 

    <button class="btn btn-default" type="submit" name="tbButton" value="questsend">Senden</button> 
} 

<script> 
    $(document).ready(function() { 
     $(".non-zero-num").val($(this).val() == 0 ? ' ' : $(this).val()); 
    }) 

    $('#verifyform').on('click', '[value="questsend"]', function() { 
     if ($('#agree').is(':checked')) { 
      return true; 
     } 
     else {    
      return false; 
     } 
    }); 

</script> 

編輯

這裏我QuestionViewModel

public class QuestionViewModel 
{ 
    //Other Properties 

    [Required(ErrorMessage = "Bitte die Nutzungsbedingungen annehmen!")] 
    public bool NutzungsbedingungenAngenommen { get; set; } 
} 

我HttpPost控制器視圖1:

[HttpPost] 
public ActionResult DefaultForm(QuestionViewModel viewModel, string tbButton) 
{ 
    if (ModelState.IsValid) 
    { 
     try 
     { 
      if (tbButton.Equals("questsend")) 
      { 
       return RedirectToAction("Verify", viewModel); 
      } 
      else if (tbButton.Equals("questupload")) 
      { 
       //write to DB 
       return View(viewModel); 
      } 
      else 
      { 
       dropdownPopulate(viewModel); 
       return View("DefaultForm", viewModel); 
      } 
     } 
     catch 
     { 
      dropdownPopulate(viewModel); 
      return View(viewModel); 
     } 
    } 
    else 
    { 
     dropdownPopulate(viewModel); 
     return View(viewModel); 
    } 
} 
+0

我不明白爲什麼View2的HttpGet有'QuestionViewModel'參數。請在HttpGet for View2中顯示View1的HttpPost代碼和'return View(viewModel);'之前的代碼。 – ekad

+0

@ekad我的View1是用戶填寫數據的表單。然後httppost控制器將其重定向到view2,用戶可以在這裏說出一切是否正確,或者他是否想要返回並更正某些內容。 view2中的'viewModel''參數是因爲我需要從視圖模型的數據將其顯示給用戶 – Shaorandra

回答

0

問題是你用Html.DisplayFor顯示在視圖2 viewModel的屬性值,所以該值將不會被提交給HttpPost刪除string tbButton參數方法,因此當執行View2的HttpPost時,viewModel爲空。將僅提交<input>,<textarea><select>標記中的值。

您可以通過添加Html.HiddenForHtml.BeginFormviewModel所有屬性提交的viewModel值的HttpPost的視圖2。您也應該使用Html.CheckBoxFor(m => m.NutzungsbedingungenAngenommen)作爲複選框。像下面的東西應該工作

@using (Html.BeginForm("Verify", "QuestionForm", FormMethod.Post, new { id = "verifyform" })) 
{ 
@Html.AntiForgeryToken() 
@Html.HiddenFor(m => m.Per_Salutation) 
@Html.HiddenFor(m => m.Per_Name_First) 
@Html.HiddenFor(m => m.Per_Name_Last) 
.... // Html.HiddenFor for the rest of QuestionViewModel properties 

.... 
.... // the rest of your code inside the form tag 
.... // remove <input type="checkbox" id="NutzungsbedingungenAngenommen " /> 

@Html.CheckBoxFor(m => m.NutzungsbedingungenAngenommen) 
<button class="btn btn-default" type="submit" name="tbButton" value="questsend">Senden</button> 
} 
+0

非常感謝你! :))) – Shaorandra

0
  • 請務必聲明應該由剃鬚刀使用什麼型號的。

    @model QuestionViewModel 
    
  • 請確保您的HTML輸入的名稱和ID的格式符合MVC modelbinder的預期格式。我建議使用提供的HtmlHelpers而不是手寫輸入標籤。

    @Html.CheckBoxFor(m => m.Agree) 
    
  • 從POST操作

+0

,所以我將輸入更改爲@ Html.Checkbox。現在viewModel.Agree是真的。其餘的仍然是空的。 – Shaorandra

+0

Ah和@model QuestionViewModel在頁面頂部定義:D和字符串Button,我需要。如果我拿出來,視覺工作室告訴我,我已經有一個成員作爲驗證與相同的參數(它顯然忽略Httppost) – Shaorandra