ASP.NET MVC,Webform混合

时间:2009-08-14 14:40:53

标签: asp.net asp.net-mvc webforms

我们(我和我的团队)有一个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,特别是第三方控件使用的动态生成脚本。

3 个答案:

答案 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站点并且未真正使用视图状态。