我相信这有一个简单的答案。原谅我的无知;经过15年的ASPNET WebForms,这个新颖的web v2.0的东西正在踢我的后方。MVC状态 - 对象为空
我想了解为什么我的WebUser
对象在HttpPost上为null。
所以我有这样的控制器操作:
[HttpGet]
public ViewResult PrivateKey()
{
var pk = new PrivateKey { WebUser = GetWebUserFromSession() };
return View(pk);
}
这工作得很好,我的Razor视图可以访问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
财产始终为空。
我不知道,如果MVC需要[Serializable]
属性被放置在WebUser
财产或如果我使用HttpPost不正确,或者即使它在MVC刚刚接受实践不断跑回I/O数据存储到不断地获取数据,而不是在内存中维护标准的面向对象的数据结构。
如果将有所帮助,这里就是我试图让工作的看法:
@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>
总之,我很困惑,为什么httpPost
控制器操作是从回发收到有效PrivateKey
对象,但包含在PrivateKey
对象中的对象始终为空。
提前致谢! --Oldtimer :)
你需要显示你的视图 - 你如何生成'WebUser'属性的表单控件? –
add'@ Html.HiddenFor(x => x.WebUser。属性)'在BeginForm中为WebUser中的所有属性设置,以便for在内部具有这些值,并且可以将它们发回给控制器。现在,您的表单对此WebUser没有任何线索,因此您将得到空值 –
您不会为“WebUser”的属性生成任何表单控件,因此不会将与它有关的任何内容提交回控制器。由于您没有编辑任何与WebUser相关的任何内容,只需在POST方法中重新获取它(就像您在GET方法中一样) - 没有必要通过添加隐藏的输入来生成额外的html,然后再次将其重新发回(你只会打开自己的恶意用户过度发布攻击) –