1

我正在重新编写一个 ASP.NET 应用程序并注意到行为上的不同......

在我的 Page_Load 事件中,我有一些代码,例如:

string id = Request["id"]

它从 URL 中获取 id 参数。在页面加载(即 HTTP GET)时,这在两个版本中都按预期工作。我还有一个按钮 onclick 事件处理程序。显然,这对服务器执行 POST,并且还调用 Page_Load 处理程序。不同的是,在应用程序的原始版本中,id 是从请求中成功加载的。在新版本的应用程序中,id 返回为 null。我发现我需要使用 Request.Params["id"] 代替,但我完全不明白为什么 Request["id"] 在一个应用程序中适用于 POST 请求而不适用于另一个。

应用程序之间的唯一区别是第一个创建为文件 -> 新网站,第二个创建为文件 -> 新 Web 应用程序。我认为这是导致行为差异的原因,但我想知道为什么会出现这种细微的差异,以及两者之间是否还有其他我应该注意的地方。

非常感谢任何建议。

4

2 回答 2

0

我总是使用 Web 应用程序项目,但不同之处在于编译。网站有动态编译,这意味着第一次请求会比较慢,并且 web 应用程序有预编译的发布 dll。

检查这个的赞成和反对:http: //maordavid.blogspot.ca/2007/06/aspnet-20-web-site-vs-web-application.html

于 2012-04-18T23:01:04.377 回答
0

正如您所提到的,您有两次 id 参数。这是因为您在查询字符串参数中有一个,在表单参数中有一个。我不确定为什么会在一个 Web 应用程序中而不是另一个 Web 应用程序中发生这种情况,但是您可以对代码进行更改以以更正确的方式解决它。

如果您在浏览器中查看 HTML 的源代码,您将看到action表单的值将是当前页面 URL,包括查询字符串。这就是发送第一个 id 的原因。显然,第二个 id 是通过表单本身传递的:

基本网页表单的 HTML 源代码

<form method="post" action="Default.aspx?id=3" id="ctl01">
    <input type="text" name="id">
</div>

您可以在这里做几件事:

  1. 首先,我不会为此使用Request.Params ["id"],因为它将查询字符串、表单、cookie 和服务器变量组合到一个集合中。您应该使用Request.QuerystringRequest.Form属性,根据您的需要和时间
  2. 在您的 Page_Load 处理程序中,使用Page.IsPostBack属性来确定页面是为 GET 还是 POST 加载,并使用上述的 Request 属性。

Page.IsPostBack 用法示例:

protected void Page_Load(object sender, EventArgs e)
{
    string id = string.Empty;
    if (Page.IsPostBack)
    {
        id = Request.Form["id"];
    }
    else
    {
        id = Request.QueryString["id"];
    }
}
于 2012-04-19T00:23:59.873 回答