пользовательский адаптер управления формой не работает - PullRequest
1 голос
/ 17 февраля 2012

У меня есть веб-сайт с настраиваемым адаптером управления, созданным для перезаписи действия в формах.(Это сайт, который мы унаследовали от другого агентства). При работе на localhost в режиме отладки все работает отлично.Но как только я опубликую сайт на сервере в нашей среде QA, пользовательский адаптер перестает работать.

Я опубликовал с символами отладки и подключен к процессу w3wp.пошаговое выполнение процесса загрузки страницы, и точки останова, установленные в адаптере настраиваемого элемента управления, никогда не будут затронуты.Когда вы запускаете debug на localhost, они запускаются при каждой загрузке страницы.Рабочий код запускается на том же сервере, и работает настраиваемый адаптер управления.Но нам нужно обновить производственную версию, и мы боимся, что мы сломаем производственную площадку.

Кто-нибудь знает, почему настраиваемый адаптер управления не будет работать на сервере?Я никогда раньше не использовал пользовательские адаптеры, нужно ли что-либо делать, кроме как поместить адаптер в папку App_Code и запись в файле .browser в папке App_Browser?в папке App_Code:

public class FormRewriterControlAdapter : System.Web.UI.Adapters.ControlAdapter {

    protected override void Render(System.Web.UI.HtmlTextWriter writer) {
        base.Render(new RewriteFormHtmlTextWriter(writer));
    }

}

public class RewriteFormHtmlTextWriter : HtmlTextWriter {
    public RewriteFormHtmlTextWriter(HtmlTextWriter writer)
        : base(writer) {
        InnerWriter = writer.InnerWriter;
    }
    public RewriteFormHtmlTextWriter(TextWriter writer)
        : base(writer) {
        InnerWriter = writer;
    }

    public override void WriteAttribute(string name, string value, bool fEncode) {
        // if the attribute we are writing is the "action" attribute, and we are not on a sub-control, 
        // then replace the value to write with the raw URL of the request - which ensures that we//ll
        // preserve the PathInfo value on postback scenarios

        if (name == "action") {
            HttpContext Context = HttpContext.Current;

            if (Context.Items["ActionAlreadyWritten"] == null) {
                // Because we are using the UrlRewriting.net HttpModule, we will use the 
                // Request.RawUrl property within ASP.NET to retrieve the origional URL
                // before it was re-written.  You//ll want to change the line of code below
                // if you use a different URL rewriting implementation.

                value = Context.Request.RawUrl;

                // Indicate that we//ve already rewritten the <form>//s action attribute to prevent
                // us from rewriting a sub-control under the <form> control

                Context.Items["ActionAlreadyWritten"] = true;
            }
        }

        base.WriteAttribute(name, value, fEncode);
    }
}

И мой файл .browser в папке App_Browser:

<browsers>

  <browser refID="Default">
    <controlAdapters>
      <adapter controlType="System.Web.UI.HtmlControls.HtmlForm" adapterType="FormRewriterControlAdapter" />
      <!--<adapter controlType="System.Web.UI.HtmlControls.HtmlLink" adapterType="LinkRewriterControlAdapter" />-->
    </controlAdapters>
  </browser>

</browsers>
...