【问题标题】:How can I modify a form field value during form submission?如何在表单提交期间修改表单字段值?
【发布时间】:2014-03-31 22:49:17
【问题描述】:

我正在使用 ASP.NET 表单控件开发一个表单。表格字段之一是出生日期。日期格式为 dd/mm/yyyy。我需要做的实际上是在用户提交表单但在数据进入服务器之前将此表单字段转换为 mm/dd/yyyy,因为表单数据将要发送的系统强制美国日期格式(mm/dd/ yyyy) 我无法控制,因此 dd/mm/yyyy 中的所有日期格式都将被反转,因此它们将不正确。所以我需要事先实际切换它,所以它实际上反转回正确的格式。这是我为了切换值而写的。

string userDOB = Request.Form["txtDOB2"];
DateTime convertedDOB = Convert.ToDateTime(userDOB);
txtDOB2.Text = convertedDOB.ToString("MM/dd/yyyy");

注意:我正在检查以确保“出生日期”字段不为空或为空等,只是发布与我的问题相关的特定代码。

我正在通过提交按钮单击操作在代码中运行它。到目前为止,测试标签只是附加切换的日期格式值以确认其工作。但是我不确定如何切换表单值本身,以便它最终出现在实际发布的表单数据中。 Request.Form 是只读的,所以我不知道如何将修改日期分配给表单字段值。

另一个潜在问题是表单操作是针对外部源的,在表单运行的域之外。

【问题讨论】:

  • 你可以使用 jquery datepicker jqueryui.com/datepicker。在这里您可以强制使用日期格式,使其不会更改为规定格式。
  • 尝试使用 DateTime.ParseExact("28/08/2012", "dd/MM/yyyy", CultureInfo.InvariantCulture) .ToString("MM/dd/yyyy", CultureInfo.InvariantCulture) ;
  • 查看此链接,它可能对您有所帮助。 Click here
  • this article 可能有助于检查日期
  • @Professor 我不想完全强制使用日期格式。我需要它对用户来说是 dd/mm/yyyy,但是我需要在服务器端调整它,因为表单数据要从服务器强制美国日期格式。

标签: c# asp.net


【解决方案1】:

这就是我要攻击它的方式:

FormatDatesModule.cs

public class FormatDatesModule : IHttpModule
{
    private static readonly Regex dateFilter = new Regex(@"^(?<d>\d{2})\/(?<m>\d{2})\/(?<y>\d{4})$", RegexOptions.Compiled);

    public void Init(HttpApplication context)
    {
        context.BeginRequest += (sender,e) => {
            HttpRequest request = ((HttpApplication)sender).Request;

            if (request.QueryString.Count > 0)
            {
                this.FormatDatesInCollection(request.QueryString);
            }

            if (request.HttpMethod == "POST" && request.Form.Count > 0)
            {
                this.FormatDatesInCollection(request.Form);
            }
        };
    }

    private static void FormatDatesInCollection(NameValueCollection parameters)
    {
        // Bypass readonly
        PropertyInfo isReadOnly = parameters.GetType().GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);
        isReadOnly.SetValue(parameters, false, null);

        for (var i = 0; i < parameters.Count; i++)
        {
            Match dateMatch = dateFilter.Match(parameters[i]);
            if (dateMatch.Success)
            {
                parameters[i] = String.Join("/", dateMatch.Groups["m"].Value, dateMatch.Groups["d"].Value, dateMatch.Groups["y"].Value);
            }
        }

        isReadOnly.SetValue(parameters, true, null);
    }

    public void Dispose()
    {
    }
}

web.config

<configuration>
    <system.web>
        <httpModules>
            <add name="FormatDatesModule" type="FormatDatesModule"/>
        </httpModules>
    </system.web>
    <system.webServer> <!-- IIS 7 Integrated Mode -->
        <modules>
            <add name="FormatDatesModule" type="FormatDatesModule"/>
        </modules>
    </system.webServer>
</configuration>

【讨论】:

  • 我认为程序化方法将是最好的方法。表单操作是外部的,因此它可能是按照我想要的方式发布表单数据的唯一方法。
【解决方案2】:

您可以在按钮单击事件上编写此代码。 例如

    textBox1.Text="31/03/2014"

然后

   Button_click()
   {
        DateTime MyDateTime = new DateTime();
        MyDateTime = DateTime.ParseExact(textBox1.Text, "MM/dd/yyyy", null);
        textBox2.Text = MyDateTime.ToString("dd/MM/yyyy");
   }

或者直接可以使用

   textBox2.Text=(DateTime.ParseExact(textBox1.Text, "MM/dd/yyyy",null).ToString("dd/MM/yyyy"));

首先您必须将其转换为 DateTime 格式,然后再转换为字符串。希望对您有所帮助。

【讨论】:

  • 这有效,但仅当 ASP.NET 表单操作本身即回发时。表单操作是针对外部源的,因此一旦表单被提交,新的日期值就会丢失。抱歉,我之前应该提到这一点。
  • 对不起,我没有得到您的问题,如果您担心数据丢失,您可以将该数据保存在一个变量(如字符串)中并进一步使用该变量。
  • 由于表单的表单操作是一个外部 URL(不是回发给自己),因此转换后的 DOB 变量不会在表单数据中发送。相反,我使用 WebRequest 发送数据,从那里我可以指定转换为 MM/DD/YYYY 的 DOB 变量。
【解决方案3】:

在查看完所有内容后,我决定使用 WebRequest:

http://msdn.microsoft.com/en-us/library/debx8sh9.aspx

由于表单操作是外部 URL(不在同一个域中),我得出的结论是我无法修改表单数据。但是,通过允许表单回发并在后面的代码中指定表单操作和其他所有内容,我能够指定要发送的 DOB 值,使用 Himanshu 的 DOB 转换方法,我能够在切换 DOB 的情况下发布表单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    • 2015-04-13
    • 2011-02-03
    • 2021-09-01
    • 1970-01-01
    • 2017-12-20
    • 2017-09-29
    相关资源
    最近更新 更多