2016-04-26 76 views
0

我相信这有一个简单的答案。原谅我的无知;经过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 :)

+0

你需要显示你的视图 - 你如何生成'WebUser'属性的表单控件? –

+2

add'@ Html.HiddenFor(x => x.WebUser。属性)'在BeginForm中为WebUser中的所有属性设置,以便for在内部具有这些值,并且可以将它们发回给控制器。现在,您的表单对此WebUser没有任何线索,因此您将得到空值 –

+1

您不会为“WebUser”的属性生成任何表单控件,因此不会将与它有关的任何内容提交回控制器。由于您没有编辑任何与WebUser相关的任何内容,只需在POST方法中重新获取它(就像您在GET方法中一样) - 没有必要通过添加隐藏的输入来生成额外的html,然后再次将其重新发回(你只会打开自己的恶意用户过度发布攻击) –

回答

0

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

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

然而,@Stephen Muecke和@gabriel使优秀的观点,我认为我会需要重新思考此应用程序的流程。它目前是一个Webforms网站,并且以桌面应用程序风格编写,只有在创建/关闭新会话时才对对象进行序列化和反序列化,并将这些对象传递到所有页面,无论这些页面是否真的需要所有这些数据。

在深入研究MVC并更好地理解Http的实际工作原理之后,我想这需要改变,因此只有真正需要的数据被提取并通过管道传递。

再次感谢大家!

0

看起来您的表单看起来只是回传其中一个属性。如果您在表单中不需要它,那么只需在文章中再次捕获它,或者适当地更改您的视图模型。