我的表单为
<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来更改表单操作。但是,标记正确的答案是通过代码隐藏实现此目的的正确方法。
答案 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