後,我使用助手Html.Serialize
在我的意見之一,序列化一個對象,然後我在使用MvcSerializer這樣我控制器再次反序列化:問題與MvcSerializer從MVC2更新到MVC3
(RegistrationViewModel) new MvcSerializer().Deserialize(serializedObject);
這之前工作正常,但升級到MVC3(和MVC3期貨)後,Deserialize
方法已更改,因此它現在有另外一個參數:SerializationMode。我可以設置爲Signed
或EncryptedAndSigned
。
無論我使用哪種方法,我都會得到一個SerializationException
,要求我驗證數據是否使用了我試圖反序列化的相同模式進行序列化。
在我看來,出於某種原因,IntelliSense不適用於Serialize方法,所以我不知道這是否也有任何額外的重載。
但問題很簡單:我現在如何在MVC3
中反序列化我的控制器中的數據,我在視圖中使用Html.Serialize
進行了序列化?
編輯 - 添加了一些代碼
從控制器
私人RegistrationViewModel registeredAccount;
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>
...
我手工做反序列化,因爲它的不是一個參數,但我從OnActionExecuting方法中的Request.Form中獲取反序列化的對象。我沒有在Serialize調用中獲得IntelliSense,我不知道有SerializableMode的變體。但是,即使我設置爲相同的值,我也會得到相同的錯誤消息。我會在上面的問題的更新中發佈一些代碼。如果你能看到發生了什麼問題,我會很感激。 – 2011-05-27 09:58:26
更改後,即使我得到相同的異常,我現在收到一個內部異常,說該屬性不能爲空。那麼它可能只是現在正在被反序列化的實際對象的問題。然後,我應該能夠自己解決其他問題。非常感謝你的幫助。 – 2011-05-27 10:07:44