POST上缺少请求参数

时间:2012-04-18 22:27:44

标签: asp.net

我正在重写一个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应用程序。我认为这是导致行为差异的原因,但我想知道为什么会出现这种微妙的差异,以及如果还有其他什么我应该注意到2之间。

任何建议都非常感谢。

2 个答案:

答案 0 :(得分:0)

我总是使用Web应用程序项目,但区别在于编译。网站有一个动态编译,这意味着第一个请求将更慢,Web应用程序已预编译发布dll。

检查这个是专业人士和骗子:http://maordavid.blogspot.ca/2007/06/aspnet-20-web-site-vs-web-application.html

答案 1 :(得分:0)

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

如果您在浏览器中查看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和服务器变量组合到一个集合中。您应根据需要和
  2. 时使用Request.QuerystringRequest.Form属性
  3. 在Page_Load处理程序中,使用Page.IsPostBack属性确定页面是否正在加载GET或POST并使用上述请求属性。
  4. 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"];
        }
    }