Обратная передача не работает с маршрутизацией ASP.NET (проверка MAC представления состояния не удалась) - PullRequest
5 голосов
/ 23 октября 2008

Я использую ASP.NET 3.5 SP1 System.Web.Routing с классическими веб-формами, как описано в http://chriscavanagh.wordpress.com/2008/04/25/systemwebrouting-with-webforms-sample/

Все отлично работает , у меня есть собственные URL-адреса SEO и даже работает постбэк. Но есть случай, когда постбэк всегда терпит неудачу , и я получаю:

Не удалось проверить MAC представления состояния. Если это приложение размещено на веб-ферме или в кластере, убедитесь, что в конфигурации указан одинаковый ключ validationKey и алгоритм проверки. Автогенерация не может использоваться в кластере.

Вот сценарий для воспроизведения ошибки:

  1. Создать стандартную веб-форму mypage.aspx с помощью кнопки
  2. Создать маршрут, который отображает «a / b / {id}» в «~ / mypage.aspx»
  3. Когда вы запускаете сайт, вы можете перемещаться http://localhost:XXXX/a/b/something, страница работает. Но когда вы нажимаете кнопку, вы получаете ошибку. Ошибка не возникает, когда Маршрут просто "a / {id}".

Похоже, это связано с количеством подпутей в URL. Если есть хотя бы 2 подпути, проверка состояния состояния завершается неудачей.

Вы получаете ошибку даже при EnableViewStateMac = "false".

Есть идеи? Это ошибка?

Спасибо

Ответы [ 6 ]

8 голосов
/ 17 февраля 2009

Я обошел это, заставив пользовательский элемент управления view наследовать от этого класса вместо ViewUserControl<T> (это своего рода патч для RenderView). Это помогло мне, надеюсь, это сработает и у вас.

public class ViewUserControlWithoutViewState<T> : ViewUserControl<T> where T : class {
    protected override void LoadViewState(object savedState) {}

    protected override object SaveControlState() {
        return null;
    }

    protected override void LoadControlState(object savedState) {}

    protected override object SaveViewState() {
        return null;
    }

    /// <summary>
    /// extracted from System.Web.Mvc.ViewUserControl
    /// </summary>
    /// <param name="viewContext"></param>
    public override void RenderView(ViewContext viewContext) {
        viewContext.HttpContext.Response.Cache.SetExpires(DateTime.Now);
        var containerPage = new ViewUserControlContainerPage(this);
        ID = Guid.NewGuid().ToString();
        RenderViewAndRestoreContentType(containerPage, viewContext);
    }

    /// <summary>
    /// extracted from System.Web.Mvc.ViewUserControl
    /// </summary>
    /// <param name="containerPage"></param>
    /// <param name="viewContext"></param>
    public static void RenderViewAndRestoreContentType(ViewPage containerPage, ViewContext viewContext) {
        string contentType = viewContext.HttpContext.Response.ContentType;
        containerPage.RenderView(viewContext);
        viewContext.HttpContext.Response.ContentType = contentType;
    }

    /// <summary>
    /// Extracted from System.Web.Mvc.ViewUserControl+ViewUserControlContainerPage
    /// </summary>
    private sealed class ViewUserControlContainerPage : ViewPage {
        // Methods
        public ViewUserControlContainerPage(ViewUserControl userControl) {
            Controls.Add(userControl);
            EnableViewState = false;
        }

        protected override object LoadPageStateFromPersistenceMedium() {
            return null;
        }

        protected override void SavePageStateToPersistenceMedium(object state) {}
    }
}

Я писал об этом некоторое время назад.

1 голос
/ 17 февраля 2009
1 голос
/ 10 января 2009

Я также обнаружил эту ошибку в asp.net mvc beta. Это может быть очень воспроизведено. После создания приложения asp.net mvc с использованием шаблона по умолчанию добавьте элемент управления asp: button на страницу home.aspx в режиме конструктора, нажмите клавишу f5, домашняя страница отображается правильно. нажмите на кнопку, эта ошибка появится. После некоторой отладки исходного кода mvc, я обнаружил, что это вызвано ViewUserControl на странице site.master, просто прокомментируйте <% Html.RenderPartial ("LoginUserControl"); %>, тогда событие щелчка может быть обработано правильно.

Я также обнаружил, что такие настройки, как enableViewStateMac = "false" enableEventValidation = "false" viewStateEncryptionMode = "Никогда", бесполезны.

В исходном коде mvc следующий раздел обрабатывает рендеринг ViewUserControl

публичная виртуальная пустота RenderView (ViewContext viewContext) {

// TODO: Remove this hack. Without it, the browser appears to always load cached output
viewContext.HttpContext.Response.Cache.SetExpires(DateTime.Now);
**ViewUserControlContainerPage containerPage = new ViewUserControlContainerPage(this);**
// Tracing requires Page IDs to be unique.
ID = Guid.NewGuid().ToString();
containerPage.RenderView(viewContext);

}

закрытый закрытый класс ViewUserControlContainerPage: ViewPage {

public ViewUserControlContainerPage(ViewUserControl userControl) {
    Controls.Add(userControl);
}

}

ViewUserControl всегда отображается на вновь созданной странице контейнера, эта страница не выберет ваши настройки. Фактически, если перейти к этому разделу, вручную изменить параметр container.enableViewStateMac на false, это поможет устранить ошибку. Поэтому единственный способ решить эту проблему - попросить Microsoft изменить код mvc.

0 голосов
/ 27 апреля 2010

Просто попробуйте очистить куки на вашем локальном компьютере. Была такая же проблема, и это помогло.

0 голосов
/ 21 ноября 2008

У меня была такая же проблема, У меня был какой-то жулик

<form></form>

Теги, когда я удалил их со своей страницы, ошибка больше не появлялась

0 голосов
/ 23 октября 2008

Вы используете сафари в качестве браузера? если это так, то это, вероятно, будет проблемой с большим поплавком. Уберите этот поплавок, и все будет хорошо.

...