回发不适用于aspx页面作为默认文档

时间:2011-08-29 09:28:28

标签: .net asp.net iis

如果我浏览http://localhost/edumatic3/trunk/login/accesscode/Default.aspx,我的回发工作正常。但是,如果我浏览到http://localhost/edumatic3/trunk/login/accesscode/(Default.aspx被定义为默认文档),我的回发将不起作用。

有没有办法让这项工作?或者我应该删除默认文档并强制用户浏览到http://localhost/edumatic3/trunk/login/accesscode/default.aspx

更新:

代码(部分):

<div id="continueDiv">
        <asp:ImageButton ID="continueImageButton" 
                runat="server" ValidationGroup="continue" 
                OnClick="ContinueImageButton_Click" 
                AlternateText="<%$ Resources:login, continue_alternatetext %>"/>
    </div>

代码背后(部分):

protected void Page_Load(object sender, EventArgs e)
{
    Log.Debug("Page_Load(...)");
    Log.Debug("Page_Load(...) :: PostBack = " + IsPostBack);

    if (!IsPostBack)
    {
        continueImageButton.ImageUrl = "~/App_Themes/" + base.Theme 
        + "/images/" + Resources.login.btn_continue;
    }
}

/// <summary>
/// Continue Image Button Click Handler
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void ContinueImageButton_Click(object sender, EventArgs e)
{
 ....

当我点击ImageButton时,会触发Page_Load,并且IsPostBack为false ...通常,它应该为true。完全没有触发ContinueImageButton_Click(...)。

在HTML(部分)中:

<input type="image" name="ctl00$ContentPlaceHolder1$continueImageButton" 
id="ctl00_ContentPlaceHolder1_continueImageButton" 
src="../../App_Themes/LoginTedu/images/en_continue.png" alt="Continue" 
onclick="javascript:WebForm_DoPostBackWithOptions(new 
WebForm_PostBackOptions(&quot;ctl00$ContentPlaceHolder1$continueImageButton&quot;, 
&quot;&quot;, true, &quot;continue&quot;, &quot;&quot;, false, false))" 
style="border-width:0px;">

Http请求:

POST /edumatic3/trunk/login/accesscode/ HTTP/1.1
Host: localhost
Referer: http://localhost/edumatic3/trunk/login/accesscode/
Content-Length: 1351
Cache-Control: max-age=0
Origin: http://localhost
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 
   (KHTML, like Gecko)                 Chrome/13.0.782.215 Safari/535.1
Content-Type: application/x-www-form-urlencoded
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip,deflate,sdch
Accept-Language: nl,en-US;q=0.8,en;q=0.6,fr;q=0.4
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
ASP.NET_SessionId=33yal3buv310y2etuj33qghg; CurrenUICulture=en-us

__EVENTTARGET=&__EVENTARGUMENT=&__VIEWSTATE=%2FwEPDw...

8 个答案:

答案 0 :(得分:47)

我以为我会尝试重现这一点,你是绝对正确的。它在没有default.aspx的情况下中断,并提供了一个非常简单的示例。看看HTML,原因很清楚。这是因为action属性为空。

快速搜索,ASP.NET 4 Breaking Changes(请参阅IIS 7或IIS 7.5集成模式中的默认文档中不会引发事件处理程序)。

  

ASP.NET 4现在呈现HTML表单元素的action属性值   当向无扩展名URL发出请求时,将其作为空字符串   有一个映射到它的默认文档。例如,在早期版本中   在ASP.NET中,对http://contoso.com的请求会导致请求   到Default.aspx。在该文档中,开头的表单标签将是   如下例所示:

<form action="Default.aspx" />
     

在ASP.NET 4中,对http://contoso.com的请求也会导致a   请求Default.aspx。但是,ASP.NET现在呈现HTML开头   form标签,如下例所示:

<form action="" />
     

动作属性的呈现方式的这种差异可能会导致   IIS和ASP.NET处理表单帖子的细微更改。   当action属性为空字符串时,IIS   DefaultDocumentModule对象将创建一个子请求   Default.aspx的。在大多数情况下,此子请求是透明的   到应用程序代码,Default.aspx页面正常运行。

     

但是,托管代码与IIS 7或IIS之间存在潜在的交互   7.5集成模式可能导致托管的.aspx页面停止工作   在孩子请求期间正确。

我已经创建了这两个解决问题的修复程序,使用它们。

1)将此代码添加到Global.asax

void Application_BeginRequest(object sender, EventArgs e)
{
    var app = (HttpApplication)sender;
    if (app.Context.Request.Url.LocalPath.EndsWith("/"))
    {
    app.Context.RewritePath(
             string.Concat(app.Context.Request.Url.LocalPath, "default.aspx"));
    }
}

2)创建Forms ControlAdapter

public class FormControlAdapter : 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.Equals("action") && string.IsNullOrEmpty(value))
            {
                value = "default.aspx";
            }
            base.WriteAttribute(name, value, fEncode);
        }
    }
}

通过在App_Browsers \ Default.browsers

中创建此文件来注册它
<browsers>
    <browser refID="Default">
       <controlAdapters>
          <adapter controlType="System.Web.UI.HtmlControls.HtmlForm"
                            adapterType="TheCodeKing.Web.FormControlAdapter" />
       </controlAdapters>
    </browser>
</browsers>

答案 1 :(得分:14)

另一个选项是在呈现页面之前检查表单操作是否为空。这对我有用:

    public void Page_PreRender(object sender, EventArgs e)
    {
        if (string.IsNullOrEmpty(this.Page.Form.Action))
            this.Page.Form.Action = "Default.aspx";
    }

答案 2 :(得分:7)

如果您有兴趣在default.aspx文件中添加一些额外的代码,那么您可以使用博客文章here中定义的类似方法;这是关于将用户重定向到相同的默认页面,但具有明确的页面名称....

//代码,从提到的博客中复制

protected void Page_Load(object sender, EventArgs e)
{        
    string defaultPage = "default.aspx";
    string rawUrl = Request.RawUrl; //get current url

    //if current url doesn't contains default page name then add
    //default page name, and append query string as it is, if any
    if (rawUrl.ToLower().IndexOf(defaultPage) < 0)
    {
        string newUrl;
        if (rawUrl.IndexOf("?") >= 0)
        {
            // URL contains query string
            string[] urlParts = rawUrl.Split("?".ToCharArray(), 2);

            newUrl = urlParts[0] + defaultPage + "?" + urlParts[1];
        }
        else
        {
            newUrl = (rawUrl.EndsWith("/")) ? rawUrl + defaultPage : rawUrl + "/" + defaultPage;
        }

        Response.Redirect(newUrl);
    }
}

答案 3 :(得分:1)

您是否尝试过设置图片按钮以使用命令事件而不是“点击”?

我认为图片点击可能不会导致完整的回发,也许尝试定义如下内容:

  void ImageButton_Command(object sender, CommandEventArgs e) 
  {
     if (e.CommandName == "YourCommandName")
        //do your action
  }

然后像这样定义你的按钮:

      <asp:ImageButton id="btn1" runat="server"
       ImageUrl="images/image.jpg"
       OnCommand="ImageButton_Command"
       CommandName="YourCommandName"/>

我似乎记得需要这样做才能让图片按钮“提交”一个表单,所以我认为这会导致你所追回的回发。

答案 4 :(得分:0)

我曾经遇到过类似的问题。问题是在IIS中,默认文档配置为default.aspx,但我的页面名称为Default.aspx。这只是个案敏感问题。

答案 5 :(得分:0)

当我将我的Web项目从VS 2005(.Net 2.5)升级到VS2010(.Net 4.0)时,VS2010将以下内容插入到我的web.config中:

<system.webServer>
  <defaultDocument>
        <files>
          <add value="mydefaultpage.aspx" />
        </files>
    </defaultDocument>
</system.webServer>

当我导航到&#34; http:// myserver / mywebsite&#34;时,我以前能够在.Net 2.5下完成,我得到了

&#34; HTTP错误500.19 - 内部服务器错误 &#34;无法访问请求的页面,因为页面的相关配置数据无效。&#34; (它显示了&#34; defaultDocument&#34;节点。)

但是,我只需插入&#34; /&#34;就可以在web.config中非常简单地解决问题。在默认网页值的开头,如下所示:

<system.webServer>
  <defaultDocument>
        <files>
          <add value="/mydefaultpage.aspx" />
        </files>
    </defaultDocument>
</system.webServer>

我没有做其他受访者建议的其他任何事情。

这样做是否会产生任何意想不到的后果或陷阱?

答案 6 :(得分:0)

如果表单处理器操作不在根目录中,则应该能够使用绝对路径而不使用文件名。

<form action='/form/processor/' method=post id='myform'>

在.NET 2.0中测试

问题出现在空白操作路径中,但与路径条目一起正常工作。

答案 7 :(得分:0)

考虑使用通过web.config完成的URL映射。这样,您可以避免在应用程序中使用额外的代码,并让IIS为您工作。

<system.web>
    <urlMappings>
        <add url="~/login" mappedUrl="~/login/default.aspx" />
        <add url="~/login/" mappedUrl="~/login/default.aspx" />
        <add url="~/this-folder-does-not-exist" mappedUrl="~/login/default.aspx" />
        <add url="~/this-folder-does-not-exist/" mappedUrl="~/login/default.aspx" />
    </urlMappings>
</system.web>

确保包含该网址的两个版本,包括和不包含斜杠。

当您需要快速更改并且不想修改源代码时,您也可以从虚拟文件夹创建重定向(如上所示,使用'this-folder-does-not-exist'示例)。

相关问题