【问题标题】:hidden field is null on !IsPostBack and not null on IsPostBack隐藏字段在 !IsPostBack 上为空,在 IsPostBack 上不为空
【发布时间】:2009-09-24 16:24:57
【问题描述】:

首先,对于我的问题标题不明确,我深表歉意。我不知道如何在标题中简洁地描述我的问题。

我的 .aspx 中有一个隐藏字段

<input type="hidden" name="hid1" value="0" />

我想在页面加载事件期间设置该字段的值,如果不是回发。

protected void Page_Load(object sender, EventArgs e) {
    if (!Page.IsPostBack) {

        // This doesn't work!
        Request.Form["hid1"] = "1";

    }

    if (Page.IsPostBack) {

        // This DOES work!
        Request.Form["hid1"] = "1";

    }
}

问题是请求在页面加载事件期间不包含表单数组中的隐藏字段,而不是回发(即 - 第一次点击页面)。对页面的后续点击(即回发)会导致 Form 数组包含隐藏字段。

我确定它与页面的生命周期有关,但我真正需要知道的是在页面加载事件期间以及当它不是回发时如何设置隐藏字段?

编辑: 我真的,真的不想加入 runat="server" 属性!

【问题讨论】:

  • 鲍勃·考夫曼说得对;需要注意的是,当页面没有回发时,没有随请求一起发送的表单数据,所以Request.Form没有填充键"hid1"
  • 对,我也是这么认为的。

标签: asp.net request page-lifecycle hidden-field


【解决方案1】:

您可以在页面类中定义一个属性,然后在代码中修改该属性值:

    protected string HiddenFieldValue { get; set; }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (IsPostBack)
            HiddenFieldValue = "postback";
        else
            HiddenFieldValue = "not postback";
    }

然后像这样定义隐藏的表单字段,使其值设置为属性值:

    <input type='hidden' id='hidden1' value='<%=HiddenFieldValue %>' />

如果您只想在回发或非回发期间设置属性的值,您也可以添加条件:

    <input type='hidden' id='hidden1' value='<% if(IsPostBack) { %> <%=HiddenFieldValue%> <% } %>' />

【讨论】:

  • 嘭!做到了。感谢您跳出框框思考,Venr。
【解决方案2】:

尝试将输入转换为HiddenField 控件(或至少是runat="server" input),并通过其ID 引用它,而不是通过Request.Form

【讨论】:

    【解决方案3】:

    代替:

    <input type="hidden" name="hid1" value="0" />
    

    试试这个:

    <asp:HiddenField runat="server" ID="hid1" />
    

    然后在你的Page_Load()

    hid1.Value = "whatever...";
    

    当你以这种方式声明它时,它在回发之前和之后都是可见的。

    【讨论】:

    • 负面,休斯顿。请参阅我对 tomlog 的回答的回复。这会起作用,但这不是我想要的解决方案。 runat = 损坏的 id
    • 我不确定 JQuery,但如果您使用 ClientId 属性,您应该能够在 JQuery 中使用该 ID。
    【解决方案4】:

    为什么不通过在输入控件上设置'runat="server"' 使其成为服务器控件呢?然后它就可以从你后面的代码中访问了,你就可以在第一个页面加载的时候设置这个值。

    【讨论】:

    • 简而言之,因为我需要在一些 JQuery 函数中使用隐藏字段,并且我想防止 id 由于 runat="server" 而被破坏。如果我想不出任何其他方式,我会走这条路,但我会非常惊讶地发现没有办法从页面加载访问隐藏字段初始页面点击。
    • @Jagd -- 这是我对 JQuery + ASP.NET 的最大恐惧之一。使用一个习惯用法来查看您的 id 以什么结尾,如下所示: startDatePicker = $("input[id$='TextVisitStartDate']").datepicker(); TextVisitStartDate 是一个 asp.net TextBox 控件。
    • @Bob - 是的,这通常是我所做的(id$='_whatever'),但有一次我试图摆脱这种情况。当然,这似乎是一项艰巨的工作,而且我开始认为这不值得痛苦。
    • 当然,您可以在页面加载期间使用控件的 ClientId 设置 JavaScript/JQuery 变量。这样,您始终可以在脚本中使用准确的控件 ID。
    【解决方案5】:

    为什么不通过样式类访问该字段并使用 runat server=?

    【讨论】:

    • 我不确定您通过样式类访问它是什么意思。你能澄清一下或给我一个例子吗?
    • @Jagd - 您可以向隐藏的输入元素添加任意类,您可以将其用作 asp.net 不会混淆的伪 ID。例如:&lt;input type="hidden" name="hid1" value="0" class="hid1" /&gt;。然后,您可以使用类选择器语法在 jQuery 中访问它,而无需担心 Asp.Net 生成的 id:$(".hid1").function()
    猜你喜欢
    • 1970-01-01
    • 2013-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-02
    • 2018-10-08
    • 2011-08-04
    相关资源
    最近更新 更多