2016-04-26 18 views
0

これは簡単な答えがあると確信しています。私の無知を許しなさい; ASPNET WebFormsの15年後に、この新鮮なWeb v2.0のものが私の背中を蹴っています。MVC状態 - オブジェクトがnullです

なぜ私のWebUserオブジェクトがHttpPostでnullであるのかを理解しようとしています。

だから私は、このコントローラのアクションを持っている:

[HttpGet] 
public ViewResult PrivateKey() 
{ 
    var pk = new PrivateKey { WebUser = GetWebUserFromSession() }; 
    return View(pk); 
} 

これは正常に動作し、私のかみそりビューは問題なくPrivateKey.WebUserのメンバーにアクセスすることができます。

問題はHttpPostアクションに発生する:

[HttpPost] 
public ActionResult PrivateKey(PrivateKey pkey) 
{ 
    if (string.IsNullOrEmpty(pkey.Value)) 
    return View(pkey); 

    // pkey.WebUser is always null :(
    // TestKeyAgainstMockCipher(pkey.Value, pkey.WebUser); 

    InsertSecuredMasterKeyIntoSession(pkey.Value); 
    return RedirectToAction("Index", "Home"); 
} 

は、だから私は完全に正当なものであると確信している理由のために、私のPrivateKeyオブジェクトはHttpPost大丈夫伝わってくるが、PrivateKeyオブジェクト内に含まれる参照WebUserプロパティ常にnullです。

私はMVCは[Serializable]属性を必要とする場合WebUser性質上、またはMVCでそのわずか慣例場合、私は絶えずバックにI/Oデータストアに実行するために、誤って、あるいはHttpPostを使用している場合に置くことがわかりませんメモリ内に標準オブジェクト指向のデータ構造を維持して渡すのではなく、常にデータをフェッチします。

それが役立つだろう場合は、ここで私が働いて取得しようとしているビューです:httpPostコントローラのアクションがポストバックから有効なPrivateKeyオブジェクトを受信して​​いる理由を一言で言えば

@model KeePassWeb.Domain.Models.PrivateKey 

@{ 
    ViewBag.Title = "PrivateKey"; 
    Layout = "~/Views/Shared/_MasterPage.cshtml"; 
} 

@using (Html.BeginForm()) 
{ 
    <div class="privatekey"> 
    <table style=""> 
     <tr> 
      <td style="width:128px; height: 75px;"></td> 
      <td style="width:291px; height: 75px;"></td> 
     </tr> 
     <tr> 
      <td style="width:128px; height: 25px;"></td> 
      <td style="width:291px; height: 25px; "> 
       @Html.PasswordFor(x =>x.Value, new { @class = "form-control", id="txtMasterPass", style = "width:65%", placeHolder = "Password" }) 
      <input Id="btnMasterPass" type="submit" value="Submit" class="submit" /> 
      </td> 
     </tr> 
    </table> 
</div> 

<table> 
    <tr> 
     <td><img src="../Images/big_info.png" height="32px" width="32px" style="margin-right:8px;" alt="info" /></td> 
     <td> 
      @if (string.IsNullOrEmpty(@Model.WebUser.Padding)) { 
       @:This is your first login. Please create a private key passphrase. 
      } 
      else { 
       @:Please enter your private key to access your wallet. 
      } 
     </td> 
    </tr> 
</table> 
} 
<script type="text/javascript"> 
    $("#wallet").addClass("active"); 
</script> 

が、私は困惑しているが、 PrivateKeyオブジェクトに含まれるオブジェクトは常にnullです。

ありがとうございます! - 元に戻す:

+0

ビューを表示する必要があります.WebUserのプロパティのフォームコントロールをどのように生成しましたか? –

+2

'@ Html.HiddenFor(x => x.WebUser。プロパティ)をWebUser内にあるすべてのプロパティのBeginForm内に配置します。これにより、forの内部にこれらの値があり、コントローラに戻すことができます。今あなたのフォームは、このWebUserに手がかりがないので、nullを取得しています。 –

+1

WebUserのプロパティのフォームコントロールを生成しないので、コントローラには何も返されません。 'WebUser'に関連する何も編集していないので、POSTメソッドで(GETメソッドと同じように)もう一度取得してください - 隠された入力を追加し、それを元に戻して追加HTMLを生成するポイントはありませんあなたは悪意のあるユーザーによるオーバーポスト攻撃に身を任せます) –

答えて

0

ご協力いただきありがとうございます。私PrivateKeyビューに次のコードを追加するには、

@Html.HiddenFor(x => x.WebUser.Padding)

しかし(@Reddyが示唆したように)@Stephen Mueckeの問題を解決し、優れたポイントを作る@gabrielと私は再考する必要がありますするつもりだと思いますこのアプリケーションのプロセスフロー。現時点ではWebformsのWebサイトで、デスクトップアプリケーションスタイルで書かれています。新しいセッションが作成/閉じられたときにのみオブジェクトがシリアライズされ、デシリアライズされ、これらのオブジェクトはすべてのページに渡されます。

MVCを掘り下げ、Httpの実際の動作をよりよく理解した後、私はこれを変更する必要があると考えています。実際に必要なデータだけがフェッチされ、パイプラインを通過します。

もう一度おねがいします!

0

あなたのフォームは、いずれかのプロパティをポストバックしているようです。あなたのフォームにそれを必要としない場合は、投稿中に再びキャプチャするか、ビューモデルを適切に変更してください。

関連する問題