MVC状态 - 对象为空

时间:2016-04-26 00:48:58

标签: c# asp.net asp.net-mvc razor state-management

我确信这有一个简单的答案。原谅我的无知;经过15年的ASPNET WebForms,这个新奇的网络v2.0的东西正在踢我的后方。

我试图理解为什么我的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可以正常,但WebUser对象中包含的引用PrivateKey属性始终为null。

我不确定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对象中包含的对象始终为null。

提前致谢! --Oldtimer:)

2 个答案:

答案 0 :(得分:0)

看起来您的表单只发布了其中一个属性。如果您在表单中不需要它,那么只需在帖子中再次捕获它或适当地更改视图模型。

答案 1 :(得分:0)

非常感谢大家的帮助。将以下代码添加到我的PrivateKey视图中解决了问题(如@Reddy建议的那样)

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

然而,@ Steve Muecke和@gabriel提出了很好的观点,我认为我需要重新思考这个应用程序的流程。它目前是一个Webforms网站,以桌面应用程序的形式编写,只有在创建/关闭新会话时,对象才会被序列化和反序列化,并且这些对象会被传递到所有页面,无论这些页面是否实际需要所有这些数据。

在深入了解MVC并更好地理解Http实际如何工作之后,我认为这需要改变,所以只有真正需要的数据被提取并通过管道传递。

再次感谢大家!