5

我有一个表格

<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 上的表单需要发送它的post 数据和getvar1。我打算通过表单操作中的代码隐藏来调整它,但想避免使用 InnerHtml 来编写整个表单。Holly 建议使用 javascript,但我还没有找到使用 javascript 获取 GET vars 的好方法。.....只是为大众提供更多信息。

回答说明:我选择走@HollyStyles 提到的路线。ajax 调用完成后,我使用 javascript 更改表单操作。但是,标记为正确的答案是通过代码隐藏执行此操作的正确方法。

4

6 回答 6

5

您可以使用 asp.net 的控制适配器

这是一个工作示例:

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

于 2012-09-24T15:24:11.937 回答
1

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

protected void Page_Init(object sender, EventArgs e)
{
    Form.Attributes.Add("action", "/Registration/Signup.aspx");
}
于 2014-04-04T07:16:17.713 回答
0

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

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

使用 System.IO;
使用 System.Text.RegularExpressions;
使用 System.Web;

///
/// 这个类的目的是方便地修改给定asp.net页面的表单“action”。
/// 要修改操作,请在您的页面(或者,更好的是,您的 MasterPage)的代码隐藏中调用以下代码:
/// 从 http://www.codeproject.com/KB/aspnet/ASP_Net_Form_Action_Attr.aspx 复制(和修改)
///
公共类 FormActionModifier :流
{
  私有常量字符串 FORM_REGEX = "(]*>)";
  私有流_sink;
  私人多头头寸;
  字符串_url;
  公共 FormActionModifier(流接收器,字符串 url)
  {
    _sink = 水槽;
    _url = string.Format("$1{0}$3", url);
  }

  公共覆盖布尔 CanRead
  {
    得到{返回真;}
  }

  公共覆盖布尔 CanSeek
  {
    得到{返回真;}
  }

  公共覆盖布尔 CanWrite
  {
    得到{返回真;}
  }

  公共覆盖长长度
  {
    得到 { 返回 0; }
  }

  公共覆盖多头头寸
  {
    得到{返回_位置;}
    设置 { _position = 值;}
  }

  public override long Seek(long offset, System.IO.SeekOrigin 方向)
  {
    返回_sink.Seek(偏移量,方向);
  }

  公共覆盖无效SetLength(长长度)
  {
    _sink.SetLength(长度);
  }

  公共覆盖无效关闭()
  {
    _sink.Close();
  }

  公共覆盖无效冲洗()
  {
    _sink.Flush();
  }

  public override int Read(byte[] buffer, int offset, int count)
  {
    返回_sink.Read(缓冲区,偏移量,计数);
  }

  public override void Write(byte[] buffer, int offset, int count)
  {
    string s = System.Text.UTF8Encoding.UTF8.GetString(buffer, offset, count);
    正则表达式 reg = new Regex(FORM_REGEX, RegexOptions.IgnoreCase);
    匹配 m = reg.Match(s);
    如果(m.成功)
    {
      字符串形式 = 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);
  }

  ///
  /// 将表单操作设置为指定的 url
  ///
  公共静态无效SetFormAction(字符串网址)
  {
    如果(HttpContext.Current!= null)
      HttpContext.Current.Response.Filter = new FormActionModifier(HttpContext.Current.Response.Filter, url);
  } // SetFormAction()
} // 班级
于 2012-09-24T15:16:50.660 回答
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。

于 2012-09-24T15:18:20.783 回答
0

也许你可以尝试redirecttoaction

这是样本

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

希望这可以帮助。

于 2012-09-24T15:24:34.637 回答
0

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

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

于 2013-09-13T11:48:43.993 回答