C# 从MVC2更新到MVC3后MVC序列化程序出现问题
我在我的一个视图中使用helperC# 从MVC2更新到MVC3后MVC序列化程序出现问题,c#,.net,asp.net-mvc-3,serialization,deserialization,C#,.net,Asp.net Mvc 3,Serialization,Deserialization,我在我的一个视图中使用helperHtml.Serialize来序列化一个对象,然后在控制器中使用MvcSerializer再次对其进行反序列化,如下所示: (RegistrationViewModel) new MvcSerializer().Deserialize(serializedObject); 这在以前工作得很好,但在升级到MVC3(和MVC3 Futures)之后,反序列化方法发生了更改,因此它现在又有一个参数:SerializationMode 我可以将其设置为Signed或e
Html.Serialize
来序列化一个对象,然后在控制器中使用MvcSerializer再次对其进行反序列化,如下所示:
(RegistrationViewModel) new MvcSerializer().Deserialize(serializedObject);
这在以前工作得很好,但在升级到MVC3(和MVC3 Futures)之后,反序列化
方法发生了更改,因此它现在又有一个参数:SerializationMode
我可以将其设置为Signed
或encrypted和Signed
无论我使用哪种方式,我都会收到一个SerializationException
,要求我验证数据是否以我尝试反序列化的相同模式序列化
在我看来,由于某种原因,IntelliSense不适用于Serialize方法,因此我不知道这是否也会导致任何额外的重载
但问题很简单:我现在如何在MVC3
中反序列化控制器中的数据,这些数据是我在视图中用Html.Serialize
序列化的
编辑-添加了一些代码
从控制器
私有注册ViewModelRegisteredAccount
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
...
@使用(Html.BeginForm()){
@Serialize(“regData”、Model、SerializationMode.encrypted和signed)
e-posten din benyttes som brukernavn forålogge inn
e-post@Html.EditorFor(x=>x.Account.Email)
gjenta电子邮政
del din e-post med andre brukere@Html.EditorFor(x=>x.Account.ShareEmail)
fornavn@Html.EditorFor(x=>x.Account.FirstName)
etternavn@Html.EditorFor(x=>x.Account.LastName)
ønsket passord@Html.EditorFor(x=>x.Password)
吉恩塔·帕索德
}
…为什么要像这样手动反序列化对象,而不是使用
[反序列化]
属性:
[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的变体。但是,即使我将设置为相同的值,也会收到相同的错误消息。我将在上面的问题的更新中发布一些代码。如果你能看到哪里出了问题,我将不胜感激。在更改之后,即使我得到了相同的异常,我现在也得到了一个内部异常,表示属性不能为null。因此,这可能只是因为现在反序列化的实际对象存在问题。那我就可以自己解决剩下的问题了。非常感谢你的帮助。
var registrationModel = (RegistrationViewModel) new MvcSerializer()
.Deserialize(serializedObject, SerializationMode.EncryptedAndSigned);