これは簡単な答えがあると確信しています。私の無知を許しなさい; 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です。
ありがとうございます! - 元に戻す:
ビューを表示する必要があります.WebUserのプロパティのフォームコントロールをどのように生成しましたか? –
'@ Html.HiddenFor(x => x.WebUser。プロパティ)をWebUser内にあるすべてのプロパティのBeginForm内に配置します。これにより、forの内部にこれらの値があり、コントローラに戻すことができます。今あなたのフォームは、このWebUserに手がかりがないので、nullを取得しています。 –
WebUserのプロパティのフォームコントロールを生成しないので、コントローラには何も返されません。 'WebUser'に関連する何も編集していないので、POSTメソッドで(GETメソッドと同じように)もう一度取得してください - 隠された入力を追加し、それを元に戻して追加HTMLを生成するポイントはありませんあなたは悪意のあるユーザーによるオーバーポスト攻撃に身を任せます) –