65.9K
CodeProject 正在变化。 阅读更多。
Home

如何将隐藏的 input HTML 标签插入到 ASP.NET 页面中,以防止 ID 或 name 属性被重写

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.33/5 (2投票s)

2009年8月12日

CPOL

1分钟阅读

viewsIcon

556851

如何将隐藏的 input HTML 标签插入到 ASP.NET 页面中,以防止 ID 或 name 属性被重写。

引言

最近,我被要求与一个支付网关进行接口,该网关要求我通过隐藏的 input 字段发布信息。我遇到了问题,特别是 ASP.NET 重写了我的 input ID 的名称,导致网关忽略它们。我尝试了几种不同的方法来解决这个问题,但由于我正在使用母版页,似乎没有任何效果。

解决方案 1

我的解决方案是创建一个自定义控件。我包含了 “name”、“id” 和 “value” 属性。简单来说,这个控件将输出 “<input type="hidden" name="" id="" value="" />” ,并使用每个属性的值。

这是控件的代码

using System;
using System.ComponentModel;
using System.Text;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebCustomControls.HiddenField
{
    [DefaultProperty("Value")]
    [ToolboxData("<{0}:hiddenField runat="server"></{0}:hiddenField>")]
    public class hiddenField : WebControl
    {    

        [Bindable(false)]
        [Category("Appearance")]
        [DefaultValue("")]
        [Localizable(true)]
        public string Value
        {
            get
            {
                var s = (String)ViewState["Value"];
                return (s ?? String.Empty);
            }
            set
            {
                ViewState["Value"] = value;
            }

        }    

        [Bindable(false)]
        [Category("Appearance")]
        [DefaultValue("")]
        [Localizable(true)]
        public override string ID
        {
            get
            {
                var s = (String)ViewState["ID"];
                return (s ?? String.Empty);
            }
            set
            {
                ViewState["ID"] = value;
            }
        }

        [Bindable(false)]
        [Category("Appearance")]
        [DefaultValue("")]
        [Localizable(true)]
        public string Name
        {
            get
            {
                var s = (String)ViewState["Name"];
                return (s ?? String.Empty);
            }
            set
            {
                ViewState["Name"] = value;
            }

        }

        protected override void RenderContents(HtmlTextWriter output)
        {
            var sb = new StringBuilder();
            sb.AppendFormat(@"<input type=""hidden"" " + 
                            @"name=""{0}"" id=""{1}"" value=""{2}"" />", 
                            Name, ID, Value);

            output.Write(sb.ToString());
        }

    }
}

由于我正在通过代码动态添加这些标签,ASP.NET 生成的 HTML 将如下所示。ASP.NET 添加了 span 标签,但我可以接受。

<span id="ctl00_ctl07">
     <input type="hidden" name="CID" id="CID" value="123456" />
</span>
<span id="ctl00_ctl08">
      <input type="hidden" name="AMOUNT" id="AMOUNT" value="1" />
</span>

以下是一些示例 VB 代码,用于将新控件的实例添加到你的表单

Dim hidElem As New hiddenField()
hidElem.EnableViewState = False
hidElem.ID = id
hidElem.Name = id
hidElem.Value = val

Me.Form.Controls.Add(hidElem)

解决方案 2

在解决这个问题的过程中,我发现了一个更好、更简单的解决方案。显然,Microsoft 已经将解决方案包含在 CLR 中。

只需使用

ClientScript.RegisterHiddenField("name","value")

还有一件事

我还需要根据配置文件中的内容,发布到动态 URL。我发现我可以这样设置表单变量

Me.Form.Method = "post"
Me.Form.Action = URL

或者更好的是,直接将 URL 包含在 Button 控件的 PostBackUrl 中。

buttonYes.PostBackUrl = URL
© . All rights reserved.