【问题标题】:ASP.NET post doesn't workASP.NET 帖子不起作用
【发布时间】:2012-04-17 08:30:11
【问题描述】:

我第一次编写一些 ASP.NET 代码时偶然发现了一个奇怪的错误。当我点击按钮发布时,它会这样做,但没有任何参数。

代码:

<%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="Login.aspx.cs" Inherits="SingTelAPI.Login" %>
<asp:Content ID="Content1" ContentPlaceHolderID="HeadContent" runat="server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <table style="width:100%;">
        <tr>
            <td>
                &nbsp;</td>
            <td>
                &nbsp;</td>
            <td>
                &nbsp;</td>
        </tr>
        <tr>
            <td>
                &nbsp;</td>
            <td>
                <table style="width:100%;">
                    <tr>
                        <td>
                            &nbsp;</td>
                        <td align="center">
                            <asp:Label ID="Label4" runat="server" Text="Login" Font-Bold="True" 
                                Font-Names="Verdana" ForeColor="#CC0000" Font-Size="Large"></asp:Label>
                        </td>
                        <td>
                            &nbsp;</td>
                    </tr>
                    <tr>
                        <td>
                            &nbsp;</td>
                        <td>
                            &nbsp;</td>
                        <td>
                            &nbsp;</td>
                    </tr>
                    <tr>
                        <td>
                            &nbsp;</td>
                        <td>
                            <asp:Panel runat="server" DefaultButton="SubmitBtn" ID="Panel1">
                                <table style="width:100%;">
                                    <tr>
                                        <td class="style1">
                                            <asp:Label ID="Label9" runat="server" Font-Bold="True" Font-Names="Verdana" 
                                            ForeColor="#0066FF" Text="Inupt Details:"></asp:Label>
                                        </td>
                                        <td>
                                        &nbsp;</td>
                                        <td>
                                        &nbsp;</td>
                                    </tr>
                                    <tr>
                                        <td class="style1">
                                            <asp:Label ID="Label5" runat="server" Text="Email:"></asp:Label>
                                        </td>
                                        <td>
                                            <telerik:RadTextBox ID="Email" runat="server" Skin="Default">
                                            </telerik:RadTextBox>
                                        </td>
                                        <td>
                                            <asp:CustomValidator ID="EmailValidator" runat="server" 
                                            ErrorMessage="Please Enter Email" Font-Bold="True" Font-Names="Verdana" 
                                            ForeColor="#00CC66" ControlToValidate="Email" ValidateEmptyText="True" 
                                            ValidationGroup="LoginValidation"></asp:CustomValidator>
                                        </td>
                                    </tr>
                                    <tr>
                                        <td class="style1">
                                            <asp:Label ID="Label6" runat="server" Text="Password:"></asp:Label>
                                        </td>
                                        <td>
                                            <telerik:RadTextBox ID="Password" Runat="server" Skin="Default">
                                            </telerik:RadTextBox>
                                        </td>
                                        <td>
                                            <asp:CustomValidator ID="PasswordValidator" runat="server" 
                                                ControlToValidate="Password" ErrorMessage="Please Enter Password" Font-Bold="True" 
                                                Font-Names="Verdana" ForeColor="#00CC66" ValidateEmptyText="True" 
                                                ValidationGroup="LoginValidation"></asp:CustomValidator>
                                        </td>
                                    </tr>
                                    <tr>
                                        <td class="style1" colspan="3">
                                           <hr /></td>
                                    </tr>
                                    <tr>
                                        <td class="style1">
                                            <telerik:RadButton ID="SubmitBtn" runat="server" 
                                                Skin="Default" Text="Login" ValidationGroup="LoginValidation" 
                                                Width="120px">
                                            </telerik:RadButton>
                                        </td>
                                        <td>
                                            <asp:Label ID="ResultsLabel" runat="server" ForeColor="#339933"></asp:Label>
                                        </td>
                                        <td>
                                            &nbsp;</td>
                                    </tr>
                                </table>
                            </asp:Panel>
                        </td>
                        <td>
                            &nbsp;</td>
                    </tr>
                </table>
            </td>
            <td>
                &nbsp;</td>
        </tr>
        <tr>
            <td>
                &nbsp;</td>
            <td>
                &nbsp;</td>
            <td>
                &nbsp;</td>
        </tr>
    </table>
</asp:Content>

还有.cs文件:

public partial class Login : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (IsPostBack)
        {
            string email = HttpContext.Current.Request["Email"];
            Label9.Text = email;
        }
    }
}

它出于某种原因将 Label9 的文本更改为“”。首先,我认为问题在于我没有安装 Telerik,所以我安装了它。但这并没有改变任何事情。

【问题讨论】:

  • 你的按钮点击事件在哪里?
  • 这是我第一次用 ASP.NET 编写代码,代码不是我的。据我了解,如果没有提供表单,ASP.NET 会完成一个默认事件,即发布到相同的 url。

标签: asp.net telerik


【解决方案1】:

控件的 ID 在发送到客户端时会发生变化,因此在 PostBack 中 HttpContext 很可能没有 ID 为 "Email" 的字段。

试试这个:

if (IsPostBack)
{
 string email = Email.Text; //Email refers to <telerik:RadTextBox ID="Email"/>
 Label9.Text = email;
}

【讨论】:

  • 我在另一个问题中阅读了如何使用 Request 对象。为什么它在那里工作? stackoverflow.com/questions/976613/get-post-data-in-c-asp-net
  • 因为您的控件有runat="server",这意味着服务器可以操作控件并使用 ViewState 来维护它的值。您现在访问该值的方式只是通过引用控件本身,在您的情况下为“电子邮件”,并访问其中一个属性,在您的情况下为“文本”。您展示的示例使用没有runat="Server" 的控件。
  • 这个技巧不是只有在回发到同一页面时才有效吗? (我的意思是,如果我要将它发布到另一个人,那么我不应该使用 Request 对象吗?)。
  • @Vadiklk,是的,但它不是 PostBack,就像这个词的经典含义一样 => 将 BACK 发布到生成表单的页面。 PostBack 在 asp.net 中实现意味着发布到同一页面。这就是为什么在您的 Page_Load 事件中您可以看到该页面是否实际上是 PostBack。我在 asp.net 中创建了相当多的页面,但从未真正实现到另一个页面的帖子。也许这不是 asp.net 中的自然行为?最后,.net 框架确实是为执行 PostBacks 而设计的,因此 Page.IsPostBack 属性。
【解决方案2】:

我会检查所有实际发布到页面的字段,因为我怀疑Email 实际上不是Email

在 asp.net 中,尤其是主页面和内容页面,输入的 id 和名称是动态更改的。

例如,Email 可以变成 ctl00_ContentPlaceHolder1_Email 之类的东西。

这么说,您不应该需要使用Request 对象来访问发回.net 页面的字段。您可以直接访问这些值。

例如

Label9.Text = this.Email.Text;

【讨论】:

  • 这个技巧不是只有在回发到同一页面时才有效吗? (我的意思是,如果我要将它发布到另一个人,那么我不应该使用 Request 对象吗?)。
  • 是的,如果您要发布到另一个页面,那么您可以使用 Request 对象,但在 Post 时检查字段名称。
【解决方案3】:

您的按钮似乎没有附加事件处理程序,因此将其更改为:

<telerik:RadButton ID="SubmitBtn" runat="server"  Skin="Default" 
    OnClick="RadButton1_Click" Text="Login" ValidationGroup="LoginValidation"  Width="120px">
</telerik:RadButton>

并在代码隐藏中处理它:

protected void RadButton1_Click(Object sender, EventArgs e)
{
    String email = Email.Text;
}

删除 Page_Load 中的部分,因为它是多余的。

【讨论】:

  • 我必须添加事件处理程序吗?我可以回帖并在我的 page_load 函数中使用它吗?
  • @Vadiklk:你可以,但这不是一个好习惯,因为你不是处理而是假设用户操作容易出错而且不是很清楚。这就是事件处理程序存在的原因。使用带有!IsPostBack-check 的 Page_Load 仅初始化您的默认表单。
  • 那么,这个活动会做什么呢?它会将“电子邮件”声明为我们收到的电子邮件。但是它会重新加载页面并让这个函数决定如何处理发布的数据吗?
  • @Vadiklk:您的问题是关于按钮的单击事件(“当我单击按钮时......”)。所以你应该处理它,在那里你可以访问ID为Email的TextBox的Text属性。这才是你真正想要的。无需查看RequestNameValueCollection。考虑到您将来要重命名控件,那么这将不再起作用,并且您将获得运行时异常而不是编译时。
  • @Vadiklk:是的,您只需将电子邮件文本设置为与以前相同的值,这不是很有用。但你真正想要的是什么?
猜你喜欢
  • 2018-10-16
  • 2018-12-15
  • 2018-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多