пятница, 20 марта 2009 г.

Получаем абсолютный путь к файлу в аттрибуте action тега form в ASP.Net

Так уж устроена работа программиста, что периодически приходиться спотыкаться на тривиальнейших вещах. И вот споткнувшись, обязательно во время выполнения черезвычайно срочного заказа, который надо было сдать позавчера, приходиться сидеть по многу часов подряд, и искать способ обойти какую-нибудь очередную хрень. За это время, заказчик успевает плюнуть на тебя и уходит на всегда. А ты продолжаешь сидеть и пытаешься понять, где же тебя...

Так и в этот раз. Оказалось, что атрибут action тега form возвращаемый aspx страницей содержит в содержит в себе исключительно относительный путь к странице. И что делать? Могли ведь предусмотреть в webconfig-е параметр, например, AbsoluteURLs = true, который бы заменял в случае необходимости относительные пути на абсолютные? И где он? Может я просто про него не знаю?

Ну а теперь собственно решение.
В папочке App_Browsers создаем файл Form.browser. В этот файл помещаем следующий код:










После этого мы созадем классы FormRewriterControlAdapter и RewriteFormHtmlTextWriter со следующим содержимым:


namespace WebApplication1
{
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)
{
this.InnerWriter = writer.InnerWriter;
}

public override void WriteAttribute(string name, string value, bool fEncode)
{
if (name == "action")
{
HttpContext Context = HttpContext.Current;

if (Context.Items["ActionAlreadyWritten"] == null)
{
Uri url = Context.Request.Url;

value = ((new StringBuilder()).AppendFormat("http://{0}:{1}{2}", url.Host, url.Port, Context.Request.RawUrl)).ToString();
Context.Items["ActionAlreadyWritten"] = true;
}
}
base.WriteAttribute(name, value, fEncode);
}
}
}
}


Вуаля. Сейчас если соберусь, выложу способ замены относительных путей на абсолютные в других частях aspx.

1 комментарий :

  1. У меня проблема в том, что когда нажимаю на кнопку submit переход осуществляется на страницу, указанную в action (это видно в адресной строке), но вместо содержимого страницы выдаёт ошибку: "Проверка состояние вида MAC не удалась. Если приложение управляется модулем Web Farm или кластером, убедитесь, что конфигурация указывает на тот же проверочный ключ validationKey и алгоритм проверки. Функция AutoGenerate не может быть использована в кластере."
    При обновлении страницы, переходит туда, куда нужно. Если в action пишу URL во внешний мир - без проблем.

    ОтветитьУдалить