2012-03-19 9 views
3

この問題はあまり頻繁には表示されませんが、レイアウトを使用する.cshtmlがあります。レイアウトでは私が持っている:私たちは常にそうであるように、このレイアウトを使用してPOST後のViewModelデータの損失

@using (Html.BeginForm(null, null, FormMethod.Post, new { @class = "someCssClass", @id = "UserForm" })) 
{ 
     ...rest of the code 
} 

私の主な.cshtmlが上に定義されたモデルがあります:

@model CarViewModel 
@{ 
    Layout = "~/Views/Shared/_CarLayout.cshtml"; 
} 

をそれは私のアクションメソッドに戻って取得すると、

public ActionResult Cars(CarViewModel model) 
{ 
    carBL.RemoveCars(model.CarIds, model.DealerId); 
    ... 
} 

私はここで何が必要なのか、なぜこれが起こっているのかよく分かりません。通常、私はそれをautobindで正常に戻します。モデルがRAzorを使ってマークアップで使用されたときに、返されたViewModelでうまくポストバックされますが、それらのフィールドを使用していない場合は、そうではありません。私はマークアップでそれらを使用しないでください私はViewModelからxフィールドを使用していないので、永続性を強制するために、隠し値としてそれらを送り返す必要があります(これは、フォームでそれらを使用した場合、 )?

+1

Html.BeginFormはフォームをレンダリングするだけで、 '...残りのコード 'を見る必要があります。アクションに送信されるもの(およびバインドされるもの)は、フォームの要素によって決まります。 – veblock

答えて

13

値がフォームフィールドにバインドされていない場合は、nullに戻ります。

の形式では、以下のIDフィールドのようなものを使用します。

フォームが正しく掲載されているかどうかを確認するために、簡単なテストは、あなたの行動の署名を変更するだろう
@Html.HiddenFor(x => x...) 
+0

そうですね、私の前提は、モデル値がフォームマークアップで使用されている場合、フォームにバインドされているということです。 – PositiveGuy

+0

これは正しいでしょう。 「ViewState」やそれに類するものはありません。したがって、データはフォームの形にする必要があります – TheRealTy

+1

受け入れられた答えはありません。あなたたちは喜ばしくない! +1ここに... :) –

0

public ActionResult Cars(FormCollection form) 
{ 
    ... 
} 

formは人口ではない場合、あなたは、フォームの問題を持っています役職。面白いことに、FireBug、Chrome Devツール、Fiddlerなどのツールを使用して、フォームの投稿データを確認するときにこれを達成することができます。

フォームが正しくポストされている場合は、フォームの入力フィールドの名前が、期待しているCarViewModelの名前と一致することを確認する必要があります。

0

わからない、これはまだ解決されているが、これは私が(部分的コード)それを行う方法である場合:

@model MyProject.ViewModels.MyViewModel 

@using (Html.BeginForm()) 
{ 
    <table> 
      <tr> 
       <td>First Name:</td> 
       <td>@Html.TextBoxFor(x => x.FirstName, new { maxlength = "50" }) 
        @Html.ValidationMessageFor(x => x.FirstName) 
       </td> 
      </tr> 
    </table> 

    <button id="btnSave" type="submit">Save</button> 
    <button id="btnCancel" type="button">Cancel</button> 
} 

そして、HTTP POSTリクエスト処理するために、私のアクションメソッド:

[HttpPost] 
public ActionResult Create(MyViewModel viewModel) 
{ 
    // Check for null on viewModel 
    // Do what needs to be done 
} 

をこの方法で行うと、フォーム/ビューに記入された値が失われてはなりません。

+1

これは、FirstNameプロパティに対してのみ機能します。 viewModel.LastNameはビューで使用されていないのでnullになりますか? – SkeetJon

関連する問題