我有一个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
答案 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();}