2011-05-27 47 views
1

後,我使用助手Html.Serialize在我的意見之一,序列化一個對象,然後我在使用MvcSerializer這樣我控制器再次反序列化:問題與MvcSerializer從MVC2更新到MVC3

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

這之前工作正常,但升級到MVC3(和MVC3期貨)後,Deserialize方法已更改,因此它現在有另外一個參數:SerializationMode。我可以設置爲SignedEncryptedAndSigned

無論我使用哪種方法,我都會得到一個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> 

...

回答

2

你爲什麼手動反序列化你的對象是這樣,而不是使用[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); 
+0

我手工做反序列化,因爲它的不是一個參數,但我從OnActionExecuting方法中的Request.Form中獲取反序列化的對象。我沒有在Serialize調用中獲得IntelliSense,我不知道有Seri​​alizableMode的變體。但是,即使我設置爲相同的值,我也會得到相同的錯誤消息。我會在上面的問題的更新中發佈一些代碼。如果你能看到發生了什麼問題,我會很感激。 – 2011-05-27 09:58:26

+0

更改後,即使我得到相同的異常,我現在收到一個內部異常,說該屬性不能爲空。那麼它可能只是現在正在被反序列化的實際對象的問題。然後,我應該能夠自己解決其他問題。非常感謝你的幫助。 – 2011-05-27 10:07:44