如果我浏览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("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...
答案 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'示例)。