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