我们(我和我的团队)有一个ASP.NET MVC应用程序,我们正在整合一个或两个Web窗体。我们正在尝试从WebForms部分中的应用程序的MVC部分重用Master Page。我们已经找到了一种在Web表单中呈现MVC局部视图的方法,这种方法效果很好, 直到 我们尝试做回发,这就是使用WebForm的原因。
错误:
viewstate MAC验证失败。如果 此应用程序由Web托管 农场或集群,确保 配置指定 相同的validationKey和验证 算法。无法使用AutoGenerate 在群集中。
用于从WebForm (credited to "How to include a partial view inside a webform")呈现局部视图的代码:
public static class WebFormMVCUtil
{
public static void RenderPartial(string partialName, object model)
{
//get a wrapper for the legacy WebForm context
var httpCtx = new HttpContextWrapper(System.Web.HttpContext.Current);
//create a mock route that points to the empty controller
var rt = new RouteData();
rt.Values.Add("controller", "WebFormController");
//create a controller context for the route and http context
var ctx = new ControllerContext(
new RequestContext(httpCtx, rt), new WebFormController());
//find the partial view using the viewengine
var view = ViewEngines.Engines.FindPartialView(ctx, partialName).View;
//create a view context and assign the model
var vctx = new ViewContext(ctx, view,
new ViewDataDictionary { Model = model },
new TempDataDictionary());
//ERROR OCCURS ON THIS LINE
view.Render(vctx, System.Web.HttpContext.Current.Response.Output);
}
}
我对此错误的唯一体验是在Web场的上下文中,但事实并非如此。另外,我知道机器密钥用于解密ViewState。
有关如何诊断此问题的任何信息将不胜感激。
解决方法: 到目前为止,解决方法是将标题内容移动到PartialView,然后使用AJAX调用仅使用WebForms的部分视图调用页面,然后直接在MVC视图上使用PartialView。此外,我们仍然可以共享母版页的非技术特定部分,即任何非MVC特定的部分。尽管如此,这仍然不是理想的解决方案,仍然需要服务器端解决方案。
此外,这个solutino在处理具有更复杂控件的控件时会出现问题,使用JavaScript,特别是第三方控件使用的动态生成脚本。
答案 0 :(得分:1)
请参阅Mauricio Scheffer's answer。
将部分视图子类化为ViewUserControlWithoutViewState<T>
类而不是ViewUserControl<T>
解决了这个问题。
答案 1 :(得分:0)
尝试明确禁用所有MVC页面上的ViewState。
答案 2 :(得分:0)
如何禁用MAC验证?
这是一个链接
http://msdn.microsoft.com/en-us/library/ydy4x04a.aspx
EnableViewStateMac = false
您可以忽略
安全说明
永远不要将此属性设置为 生产网站中的错误。
因为您的站点是MVC站点并且未真正使用视图状态。