MVC 状态 - 对象为空
MVC State - Object is null
我相信这有一个简单的答案。原谅我的无知;在使用 ASPNET WebForms 15 年后,这个新奇的 Web v2.0 东西让我大吃一惊。
我想了解为什么我的 WebUser
对象在 HttpPost 上为空。
所以我有这个控制器动作:
[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 没问题,但是 [=15= 中包含的引用 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
对象中包含的对象始终为空。
提前致谢!
--老朋友:)
看起来您的表单只是 post返回其中一个属性。如果您的表单中不需要它,那么只需在 post 期间再次捕获它或适当地更改您的视图模型。
非常感谢大家的帮助。将以下代码添加到我的 PrivateKey
视图中解决了问题(正如@Reddy 所建议的)
@Html.HiddenFor(x => x.WebUser.Padding)
但是,@Stephen Muecke 和@gabriel 提出了很好的观点,我认为我需要重新考虑此应用程序的流程。它目前是一个 Webforms 网站,它以桌面应用程序风格编写,其中对象仅在新会话 created/closed 时才被序列化和反序列化,并且这些对象被传递到所有页面,无论这些页面实际上需要所有这些数据还是不是。
在深入研究 MVC 并更好地了解 Http 的实际工作方式后,我认为这需要改变,以便仅获取真正需要的数据并通过管道传递。
再次感谢大家!
我相信这有一个简单的答案。原谅我的无知;在使用 ASPNET WebForms 15 年后,这个新奇的 Web v2.0 东西让我大吃一惊。
我想了解为什么我的 WebUser
对象在 HttpPost 上为空。
所以我有这个控制器动作:
[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 没问题,但是 [=15= 中包含的引用 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
对象中包含的对象始终为空。
提前致谢! --老朋友:)
看起来您的表单只是 post返回其中一个属性。如果您的表单中不需要它,那么只需在 post 期间再次捕获它或适当地更改您的视图模型。
非常感谢大家的帮助。将以下代码添加到我的 PrivateKey
视图中解决了问题(正如@Reddy 所建议的)
@Html.HiddenFor(x => x.WebUser.Padding)
但是,@Stephen Muecke 和@gabriel 提出了很好的观点,我认为我需要重新考虑此应用程序的流程。它目前是一个 Webforms 网站,它以桌面应用程序风格编写,其中对象仅在新会话 created/closed 时才被序列化和反序列化,并且这些对象被传递到所有页面,无论这些页面实际上需要所有这些数据还是不是。
在深入研究 MVC 并更好地了解 Http 的实际工作方式后,我认为这需要改变,以便仅获取真正需要的数据并通过管道传递。
再次感谢大家!