【问题标题】:Problem with the MvcSerializer after updating from MVC2 to MVC3从 MVC2 更新到 MVC3 后 MvcSerializer 出现问题
【发布时间】:2011-09-03 04:02:13
【问题描述】:

我在我的一个视图中使用帮助器 Html.Serialize 来序列化一个对象,然后我在我的控制器中使用 MvcSerializer 再次反序列化它,如下所示:

(RegistrationViewModel) new MvcSerializer().Deserialize(serializedObject);

这在之前运行良好,但在升级到 MVC3(和 MVC3 期货)之后,Deserialize 方法发生了变化,现在它多了一个参数:SerializationMode。

我可以设置为SignedEncryptedAndSigned

无论我使用哪一个,我都会收到SerializationException,要求我验证数据是否以我尝试反序列化的相同模式进行序列化。

在我看来,由于某种原因,IntelliSense 不适用于 Serialize 方法,所以我不知道这是否也有任何额外的重载。

但问题很简单:我现在如何在MVC3 中反序列化我在视图中使用Html.Serialize 序列化的控制器内的数据?

编辑 - 添加一些代码

来自控制器

private RegistrationViewModel 注册账户;

protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
  var serialized = Request.Form["regData"];
  if (serialized != null)
  {
    registeredAccount = (RegistrationViewModel) new MvcSerializer().Deserialize(serialized, SerializationMode.EncryptedAndSigned);
    TryUpdateModel(registeredAccount); 
  }
  else
    registeredAccount = (RegistrationViewModel)TempData["regData"] ?? new RegistrationViewModel();
}

public ActionResult Index()
{
  if (Request.Form["nextButton.x"] != null)
    return RedirectToAction("Details");
  return View(registeredAccount);
}

从视图(序列化调用在表单的开头)

@model VektNed.Models.RegistrationViewModel
...
<div class="BodyContainer RegistrationBody">
  @using (Html.BeginForm()){
    @Html.Serialize("regData", Model, SerializationMode.EncryptedAndSigned)
    <div class="RegistrationGroup">
      <p class="Description">e-posten din benyttes som brukernavn for å logge inn.</p>
      <p><label for="Account_Email">e-post</label> @Html.EditorFor(x => x.Account.Email)<span class="ErrorMessage"></span></p>
      <p><label for="RepeatEmail">gjenta e-post</label>  <input type="text" name="RepeatEmail" id="RepeatEmail" /><span class="ErrorMessage"></span></p>
      <p><label class="CheckboxLabel" for="ShareEmail">del din e-post med andre brukere. </label> @Html.EditorFor(x => x.Account.ShareEmail)</p>
    </div>
    <div class="RegistrationGroup">
      <p><label for="Account_FirstName">fornavn</label>  @Html.EditorFor(x => x.Account.FirstName)<span class="ErrorMessage"></span></p>
      <p><label for="Account_LastName">etternavn</label>  @Html.EditorFor(x => x.Account.LastName)<span class="ErrorMessage"></span></p>
    </div>
    <div class="RegistrationGroup">
      <p><label for="Password">ønsket passord</label>  @Html.EditorFor(x => x.Password)<span class="ErrorMessage"></span></p>
      <p><label for="ConfirmPassword">gjenta passord</label>  <input type="password" name="ConfirmPassword" id="ConfirmPassword" /><span class="ErrorMessage"></span></p>
    </div>
    <div class="RegistrationGroup">
      <input class="NextAlone" name="nextButton" type="image" src="../../Images/button_next.png" alt="Neste" />
    </div>
  }
</div>

...

【问题讨论】:

    标签: c# .net asp.net-mvc-3 serialization deserialization


    【解决方案1】:

    为什么你要像这样手动反序列化你的对象而不是使用[Deserialize] atrtribute:

    [HttpPost]
    public ActionResult Index([Deserialize] RegistrationViewModel registrationModel)
    {
        ...
    }
    

    就第二个参数而言,它必须与您在视图中序列化它时使用的枚举值匹配。因此,例如,如果您认为您这样做了:

    @Html.Serialize("registrationModel", SomeModel, SerializationMode.EncryptedAndSigned)
    

    你会使用:

    [HttpPost]
    public ActionResult Index([Deserialize(SerializationMode.EncryptedAndSigned)] RegistrationViewModel registrationModel)
    {
        ...
    }
    

    或者如果您更喜欢体力劳动:

    var registrationModel = (RegistrationViewModel) new MvcSerializer()
        .Deserialize(serializedObject, SerializationMode.EncryptedAndSigned);
    

    【讨论】:

    • 我正在手动进行反序列化,因为它不是参数,但我从 OnActionExecuting 方法中的 Request.Form 中获取了要反序列化的对象。我没有在 Serialize 调用中获得 IntelliSense 我不知道具有 SerializationMode 的变体。但是,即使我将 设置为相同的值,我也会收到相同的错误消息。我将在上面的问题的更新中发布一些代码。如果您能看到那里出了什么问题,我将不胜感激。
    • 更改后,即使我遇到了同样的异常,我现在也遇到了一个内部异常,说属性不能为空。因此,这可能只是由于现在正在反序列化的实际对象存在问题。然后我应该能够自己解决其余的问题。非常感谢您的帮助。
    猜你喜欢
    • 2011-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多