在C#ASP.NET 3.5中更改HtmlForm操作

时间:2012-09-24 15:10:34

标签: c# asp.net forms code-behind html-form

我的表单为

<form id="form" action="" method="post" runat="server">

通过

访问C#代码隐藏时
HtmlForm form = (HtmlForm)this.FindControl("form");

并尝试使用

更改操作
form.Attributes.Add("action","./newpage.aspx?data=data");

form.Attributes["action"] = "./newpage.aspx?data=data");

没有变化。表单仍然路由到同一页面。如何在代码隐藏中动态更改表单的操作?

额外细节: 我有一个具有get变量的页面。需要在表单的操作部分中发送get变量。所以,page1响应有getvar1。 page1上的表单需要发送其发布数据和getvar1。我打算通过代码隐藏在表单的操作中调整它,但是想避免使用InnerHtml来编写整个表单。霍莉建议使用javascript,但我还没有找到一个用javascript获取GET变量的好方法。 .....为群众提供更多信息。

答案解释:我选择了@HollyStyles提到的路线。在ajax调用完成后,我使用javascript来更改表单操作。但是,标记正确的答案是通过代码隐藏实现此目的的正确方法。

6 个答案:

答案 0 :(得分:5)

您可以使用asp.net的Control Adapters

这是一个有效的例子:

public class RewriteFormHtmlTextWriter : HtmlTextWriter
{
    public RewriteFormHtmlTextWriter(HtmlTextWriter writer)
        : base(writer)
    {
        this.InnerWriter = writer.InnerWriter;
    }
    public RewriteFormHtmlTextWriter(System.IO.TextWriter writer)
        : base(writer)
    {
        base.InnerWriter = writer;
    }

    public override void WriteAttribute(string name, string value, bool fEncode)
    {
        if (name == "action")
        {
            value = "Change here your value"            
        }

        base.WriteAttribute(name, value, fEncode);
    }
}

使用上面的代码,并在App_Browsers上声明一个名为Form.browser的文件

<browsers>
  <browser refID="Default">
    <controlAdapters>
      <adapter controlType="System.Web.UI.HtmlControls.HtmlForm" adapterType="FormRewriterControlAdapter" />
    </controlAdapters>
  </browser>
</browsers>

您可以更改表单。当然,这个代码在每个表单中都会调用。

亲戚:http://weblogs.asp.net/scottgu/archive/2007/02/26/tip-trick-url-rewriting-with-asp-net.aspx

答案 1 :(得分:1)

您可以像这样更改表单操作:

protected void Page_Init(object sender, EventArgs e)
{
    Form.Attributes.Add("action", "/Registration/Signup.aspx");
}

答案 2 :(得分:0)

我在知识库文章中找到了一个有助于实现此目的的课程,但是,该文章似乎已被删除(原文如下:http://www.codeproject.com/Articles/23033/Change-your-ASP-NET-Form-s-Action-attribute-with-R)。

以下是该文章中提到的类。基本上,如果您使用以下类并在其上调用静态SetFormAction(string url)方法,则可以设置<form action="url" />属性。

using System.IO;
using System.Text.RegularExpressions;
using System.Web;

/// 
/// The purpose of this class is to easily modify the form "action" of a given asp.net page.
/// To modify the action, call the following code in the code-behind of your page (or, better, your MasterPage):
/// Copied (and modified) from http://www.codeproject.com/KB/aspnet/ASP_Net_Form_Action_Attr.aspx
/// 
public class FormActionModifier : Stream
{
  private const string FORM_REGEX = "(]*>)";
  private Stream _sink;
  private long _position;
  string _url;
  public FormActionModifier(Stream sink, string url)
  {
    _sink = sink;
    _url = string.Format("$1{0}$3", url);
  }

  public override bool CanRead
  {
    get { return true; }
  }

  public override bool CanSeek
  {
    get { return true; }
  }

  public override bool CanWrite
  {
    get { return true; }
  }

  public override long Length
  {
    get { return 0; }
  }

  public override long Position
  {
    get { return _position; }
    set { _position = value; }
  }

  public override long Seek(long offset, System.IO.SeekOrigin direction)
  {
    return _sink.Seek(offset, direction);
  }

  public override void SetLength(long length)
  {
    _sink.SetLength(length);
  }

  public override void Close()
  {
    _sink.Close();
  }

  public override void Flush()
  {
    _sink.Flush();
  }

  public override int Read(byte[] buffer, int offset, int count)
  {
    return _sink.Read(buffer, offset, count);
  }

  public override void Write(byte[] buffer, int offset, int count)
  {
    string s = System.Text.UTF8Encoding.UTF8.GetString(buffer, offset, count);
    Regex reg = new Regex(FORM_REGEX, RegexOptions.IgnoreCase);
    Match m = reg.Match(s);
    if (m.Success)
    {
      string form = reg.Replace(m.Value, _url);
      int iform = m.Index;
      int lform = m.Length;
      s = string.Concat(s.Substring(0, iform), form, s.Substring(iform + lform));
    }
    byte[] yaz = System.Text.UTF8Encoding.UTF8.GetBytes(s);
    _sink.Write(yaz, 0, yaz.Length);
  }

  /// 
  /// Sets the Form Action to the url specified
  /// 
  public static void SetFormAction(string url)
  {
    if (HttpContext.Current != null)
      HttpContext.Current.Response.Filter = new FormActionModifier(HttpContext.Current.Response.Filter, url);
  } // SetFormAction()
} // class

答案 3 :(得分:0)

这不是ASP.NET的工作方式。但是,您可以选择性地设置某些控件以发布到其他页面。这称为跨页面发布。见:http://msdn.microsoft.com/en-us/library/ms178139(v=vs.100).aspx。要使用按钮执行跨页回发,请参阅:http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.button.postbackurl.aspx。基本上,您只需为按钮设置PostBackUrl。

答案 4 :(得分:0)

您可以尝试redirecttoaction

这是样本

public ActionResult LogOff() {
FormsAuth.SignOut();
return RedirectToAction("Index", "Home");
}

希望这有帮助。

答案 5 :(得分:0)

我最近也有同样的问题,当发布表单操作属性时会使用重写的路径,但我想显示原始网址。我没有安装任何url重写库。

我发现这个页面对于让我的回发工作非常有用: http://www.codeproject.com/Articles/94335/TIP-How-to-Handle-Form-Postbacks-when-Url-Rewritin