Mvc Futures序列化问题:SerializationException:反序列化失败

时间:2014-01-02 22:45:30

标签: c# asp.net-mvc asp.net-mvc-4 serialization asp.net-mvc-futures

我有一个asp.net 4.5应用程序,它是一个向导UI,最后生成一个报告。我正在使用MVC Futures插件序列化并在表单之间传递模型。我可以一直点击并生成报告。我也点击F5并刷新,它将重新发布上一个请求中的表单数据并重新加载表单。

我的问题有时候,通常在等待几分钟后,如果我再次尝试在页面上按F5,而不是重新生成报告,我会收到以下错误:

  

SerializationException:反序列化失败。

似乎浏览器可能以某种方式忘记了之前的请求,并尝试刷新页面而不重新提交表单。关于发生了什么的任何想法?我将尝试通过立即重新提交表单来重现此问题,然后等待几分钟并再次进行,并使用Fiddler观察每次发布的内容。

有没有人对这里的问题有任何想法?

更新(2014年1月3日):

以下是生成报告的post方法:

[HttpPost]
public ActionResult GenerateReport([Deserialize] WizardModel wizardModel, string providerId = null, string providerName = null)
{
    var model = new ReportModel();
    if (!String.IsNullOrEmpty(providerId))
    {
        wizardModel.Providers = new List<NameValue>(){ new NameValue() { Name = providerName, Value = providerId }};
        model.AutoPrint = true;
    }

    var param = new MeasureParams()
    {
        Key = wizardModel.CriteriaKeys.ToArray(),
        ProviderIds = (wizardModel.Providers != null ? wizardModel.Providers.Select(x => x.Value).ToArray() : null),
        StartDate = (wizardModel.StartDate),
        StartDateAsString = (wizardModel.StartDate).ToString(),
        EndDate = (wizardModel.EndDate),
        EndDateAsString = (wizardModel.EndDate).ToString()
    };

    var results = _measureService.CalculateMeasures(param);

    model.WizardModel = wizardModel;
    model.Results = new List<List<ResultsModel>>();

    model.Results.AddRange(MeasureResultsMapper.MapMeasurementsResultToHierarchicalList(results));
    if (wizardModel.IsDetailedReport)
    {
        return View("DetailedReport", model);
    }
    return View("SummaryReport", model);                
}

视图页面本身并没有什么特别之处。它甚至没有序列化对象。那是在上一个评论页面。我可以发布该页面的一部分:

@{ Html.BeginForm("GenerateReport", "Wizard", FormMethod.Post, new {id = "reviewForm"});}
@Html.Serialize("wizardModel", Model)
@{Html.EndForm();}

完整堆栈跟踪:

  应用程序中的服务器错误。

     

对象引用未设置为对象的实例。 描述:执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.NullReferenceException:未将对象引用设置为对象的实例。

来源错误: 在执行当前Web请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常的起源和位置的信息。

堆栈追踪:

[NullReferenceException:对象引用未设置为对象的实例。]    System.Web.Security.MachineKey.Decode(String encodedData,MachineKeyProtection protectionOption)+268    Microsoft.Web.Mvc.MachineKeyWrapper.Decode(String encodedData,MachineKeyProtection protectionOption)+41    Microsoft.Web.Mvc.MvcSerializer.Deserialize(String serializedValue,SerializationMode mode,IMachineKey machineKey)+177

[SerializationException:反序列化失败。使用与序列化序列化相同的SerializationMode验证数据是否正在反序列化。否则看内部异常。]    Microsoft.Web.Mvc.MvcSerializer.Deserialize(String serializedValue,SerializationMode mode,IMachineKey machineKey)+384    Microsoft.Web.Mvc.MvcSerializer.Deserialize(String serializedValue,SerializationMode mode)+70    Microsoft.Web.Mvc.DeserializingModelBinder.BindModel(ControllerContext controllerContext,ModelBindingContext bindingContext)+293    System.Web.Mvc.ControllerActionInvoker.GetParameterValue(ControllerContext controllerContext,ParameterDescriptor parameterDescriptor)+317    System.Web.Mvc.ControllerActionInvoker.GetParameterValues(ControllerContext controllerContext,ActionDescriptor actionDescriptor)+117    System.Web.Mvc.Async。&lt;&gt; c_ DisplayClass25.b _1e(AsyncCallback asyncCallback,Object asyncState)+446    System.Web.Mvc.Async.WrappedAsyncResult 1.Begin(AsyncCallback callback, Object state, Int32 timeout) +130 System.Web.Mvc.Async.AsyncControllerActionInvoker.BeginInvokeAction(ControllerContext controllerContext, String actionName, AsyncCallback callback, Object state) +302 System.Web.Mvc.<>c__DisplayClass1d.<BeginExecuteCore>b__17(AsyncCallback asyncCallback, Object asyncState) +30 System.Web.Mvc.Async.WrappedAsyncResult 1.Begin(AsyncCallback回调,对象状态,Int32超时)+130    System.Web.Mvc.Controller.BeginExecuteCore(AsyncCallback callback,Object state)+381    System.Web.Mvc.Async.WrappedAsyncResult 1.Begin(AsyncCallback callback, Object state, Int32 timeout) +130 System.Web.Mvc.Controller.BeginExecute(RequestContext requestContext, AsyncCallback callback, Object state) +317 System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.BeginExecute(RequestContext requestContext, AsyncCallback callback, Object state) +15 System.Web.Mvc.<>c__DisplayClass8.<BeginProcessRequest>b__2(AsyncCallback asyncCallback, Object asyncState) +71 System.Web.Mvc.Async.WrappedAsyncResult 1.Begin(AsyncCallback回调,对象状态,Int32超时)+130    System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext,AsyncCallback回调,对象状态)+249    System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext,AsyncCallback回调,对象状态)+49    System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context,AsyncCallback cb,Object extraData)+16    System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()+301    System.Web.HttpApplication.ExecuteStep(IExecutionStep step,Boolean&amp; completedSynchronously)+155

1 个答案:

答案 0 :(得分:0)

您使用错误的语法来呈现表单。用这个替换你的表格:

@using(Html.BeginForm("GenerateReport", "Wizard", FormMethod.Post, new {id = "reviewForm"}))
{
    @Html.Serialize("wizardModel", Model)
}

Html.EndForm()不同,Html.BeginForm()不是空函数。你不能这样称呼它。如果你想渲染这样的表格,你应该像下面这样做,但我不建议这样做,因为它不容易阅读:

@Html.BeginForm()
@Html.Serialize("wizardModel", Model)
@{Html.EndForm();}