2017-07-04 16 views
1

私のViewModelは常にnullを返し、理由を知らない。誰かが自分のコードを見て、ここで何が間違っているのか、なぜ私の塗りつぶされたモデルのビューからのデータがnullというコントローラに戻ってきますか?投稿されたViewModelは常にNULLです

public class PaintballWorkerCreateViewModel 
{ 
    public PaintballWorker PaintballWorker { get; set; } 
    public PaintballWorkerHourlyRate HourlyRate { get; set; } 
} 

コントローラ

public ActionResult Create() 
{ 
    PaintballWorkerCreateViewModel model = new PaintballWorkerCreateViewModel() 
    { 
     PaintballWorker = new PaintballWorker(), 
     HourlyRate = new PaintballWorkerHourlyRate() 
     { 
      Date = DateTime.Now 
     } 
    }; 
    return View(model); 
} 

[HttpPost] 
[PreventSpam(DelayRequest = 20)] 
[ValidateAntiForgeryToken] 
public ActionResult Create(PaintballWorkerCreateViewModel paintballWorker) 
{ 
    (...) 
} 

ビュー、(コントローラにGET関数で作成されていない)もHiddenFor追加のID。

あなたのコードは正常に見える
@model WerehouseProject.ViewModels.PaintballWorkerCreateViewModel 

@{ 
    ViewBag.Title = "Utwórz pracownika"; 
    Layout = "~/Views/Shared/_Layout_Paintball.cshtml"; 
} 

<h2>Dodawanie pracownika</h2> 

@using (Html.BeginForm("Create", "PaintballWorkers", FormMethod.Post)) 
{ 
    @Html.AntiForgeryToken() 

    <div class="form-horizontal"> 
     <hr /> 
     @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 
     @Html.HiddenFor(model => model.PaintballWorker.Active) 
     @Html.HiddenFor(model => model.PaintballWorker.MoneyGot) 
     @Html.HiddenFor(model => model.PaintballWorker.PaintballWorkerID) 
     @Html.HiddenFor(model => model.HourlyRate.Date) 
     @Html.HiddenFor(model => model.HourlyRate.PaintballWorkerID) 
     @Html.HiddenFor(model => model.HourlyRate.PWHourlyRateID) 

     <div class="form-group"> 
      @Html.LabelFor(model => model.PaintballWorker.Imie, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(model => model.PaintballWorker.Imie, new { htmlAttributes = new { @class = "form-control" } }) 
       @Html.ValidationMessageFor(model => model.PaintballWorker.Imie, "", new { @class = "text-danger" }) 
      </div> 
     </div> 

     <div class="form-group"> 
      @Html.LabelFor(model => model.PaintballWorker.Nazwisko, htmlAttributes: new { @class = "control-label col-md-2" }) 

(...) 

     <div class="form-group"> 
      @Html.LabelFor(model => model.HourlyRate.HourlyRate, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(model => model.HourlyRate.HourlyRate, new { htmlAttributes = new { @class = "form-control", @type = "number", @min = "0.1", @step = "0.1", @value = "10" } }) 
       @Html.ValidationMessageFor(model => model.HourlyRate.HourlyRate, "", new { @class = "text-danger" }) 
      </div> 
     </div> 

     <div class="form-group"> 
      <div class="col-md-offset-2 col-md-10"> 
       <input type="submit" value="Dodaj pracownika" class="btn btn-primary" /> 
      </div> 
     </div> 
    </div> 
} 

<div> 
@Html.ActionLink("Powrót do listy", "Index", new object { }, new { @class = "btn btn-default" }) 
</div> 
+0

あなたのために役立つことを願っていますと、それはすべての値がnullであるか、または少数の値だけですか? –

+0

'PaintballWorker'と' HourlyRate'はモデルを作成して 'GET'関数のデータで埋めてもnullです。 – Cezar

+0

2つのクラスのコードを表示できますか? –

答えて

0

...それは、参照がどこかに失われているように見えるのですが..あなたが[PreventSpam(DelayRequest = 20)]属性を削除しようとしたがありますか?コントローラーは次のようになります。

public ActionResult Create() 
    { 
      PaintballWorkerCreateViewModel model = new PaintballWorkerCreateViewModel() 
      { 
       PaintballWorker = new PaintballWorker(), 
       HourlyRate = new PaintballWorkerHourlyRate() 
       { 
        Date = DateTime.Now 
       } 
      }; 
      return View(model); 
    } 

    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Create(PaintballWorkerCreateViewModel paintballWorker) 
    { 
     (...) 
    } 
+0

いいえ、 'PreventSpam'がヘルプを削除しました – Cezar

0

フォームを正しく転記していません。属性は隠されているので、デフォルトではnullです。

投稿後、コントローラは何も表示されません。要素が隠されているからです。したがって、それはnullです。

代わりに@Html.TextboxForという拡張メソッドを使用してください。 Mvc viewengineはテキストボックスをレンダリングし、いくつかの値を入力してポストすることができます。

また、コードに正しくルートをマップしていることを確認する必要があります。

+0

いいえ、それは問題ではありません、私は' HiddenFor'を 'EditorFor'に変更しました。 – Cezar

0

あなたの問題は、競合を命名であってもよいが、それはポストアクションのパラメータ名は、あなたのviewmodelにプロパティ名と同じではないかもしれないです

親切に下記のリンクは、次のとおりです。

https://forums.asp.net/t/1670962.aspx?ViewModel+in+post+action+is+null

解決策と問題の原因を明確に指定しました。

注:私はまた、同じ問題が長いことを背中に持ち、言及したのと同じ方法で解決しました。それはあまりにも

おかげ

カルティク

関連する問題