【问题标题】:ASP.NET MVC, Webform hybridASP.NET MVC,Webform 混合
【发布时间】:2010-11-19 16:18:44
【问题描述】:

我们(我和我的团队)有一个 ASP.NET MVC 应用程序,并且我们正在集成一两个 Web 窗体页面。我们正在尝试在 WebForms 部分中重用应用程序的 MVC 部分中的母版页。我们找到了一种在 Web 表单中呈现 MVC 部分视图的方法,效果很好,直到我们尝试回发,这就是使用 WebForm 的原因。

错误:

视图状态 MAC 验证失败。如果 此应用程序由 Web 托管 场或集群,确保 配置指定 相同的validationKey和validation 算法。无法使用自动生成 在一个集群中。

从 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);
    } 
}

我对这个错误的唯一经验是在网络农场的环境中,但事实并非如此。另外,我知道机器密钥用于解密 ViewState。

任何有关如何诊断此问题的信息将不胜感激。

解决方法: 到目前为止,解决方法是将标题内容移动到 PartialView,然后使用 AJAX 调用从 WebForms 中调用仅包含 Partial View 的页面,然后直接在 MVC 视图上使用 PartialView。此外,我们仍然能够共享母版页的非技术特定部分,即任何非 MVC 特定的部分。尽管如此,这还不是一个理想的解决方案,仍然需要一个服务器端的解决方案。

此外,此解决方案在处理具有更复杂控件的控件时存在问题,使用 JavaScript,尤其是由 3rd 方控件使用的动态生成的脚本。

【问题讨论】:

  • 我也在寻找解决方案;看来您也在 SO question id#702746 中使用相同的技术。有人吗??
  • @Kurt 编辑给予信用
  • 不确定我是否完全同意这是一个重复的问题,但谢谢你,mausch - 你之前埋在该帖子下的答案是一个可行的解决方案,尽管我肯定会更多地研究它。谢谢! @Greg - 看到这个stackoverflow.com/questions/230014/…

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


【解决方案1】:

尝试在所有 MVC 页面上显式禁用 ViewState。

【讨论】:

    【解决方案2】:

    Mauricio Scheffer's answer

    让部分视图子类化他的ViewUserControlWithoutViewState<T> 类而不是ViewUserControl<T> 为我解决了这个问题。

    【讨论】:

      【解决方案3】:

      如何禁用 MAC 验证?

      这是一个链接

      http://msdn.microsoft.com/en-us/library/ydy4x04a.aspx

      EnableViewStateMac = false

      你可以忽略

      安全提示

      永远不要将此属性设置为 在生产网站中为 false。

      因为你的站点是一个 MVC 站点并且视图状态并没有真正使用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-12-11
        • 1970-01-01
        • 2012-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-24
        相关资源
        最近更新 更多