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 のフォームは、投稿データと getvar1 を送信する必要があります。フォームのアクションでコード ビハインドを介してこれを調整するつもりでしたが、InnerHtml を使用してフォーム全体を記述することは避けたいと考えていました。Holly は JavaScript を提案しましたが、JavaScript で GET 変数を取得する良い方法が見つかりませんでした。.....大衆向けの追加情報です。

回答説明: @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

redirecttoactionを試すことができるかもしれません

ここにサンプルがあります

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

お役に立てれば。

于 2012-09-24T15:24:34.637 に答える
0

これを達成するのに役立つ KB 記事で見つけたクラスがありますが、その記事は削除されたようです (元の場所: 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 ページのフォーム「アクション」を簡単に変更することです。
/// アクションを変更するには、ページのコード ビハインドで次のコードを呼び出します。
/// http://www.codeproject.com/KB/aspnet/ASP_Net_Form_Action_Attr.aspx からコピー (および変更)
///
public class FormActionModifier : ストリーム
{
  プライベート const 文字列 FORM_REGEX = "(]*>)";
  プライベート ストリーム _sink;
  プライベート long _position;
  文字列 _url;
  public FormActionModifier (ストリーム シンク、文字列 URL)
  {
    _sink = シンク;
    _url = string.Format("$1{0}$3", URL);
  }

  public override ブール値 CanRead
  {
    取得 { true を返します。}
  }

  public override bool CanSeek
  {
    取得 { true を返します。}
  }

  public override bool CanWrite
  {
    取得 { true を返します。}
  }

  public override long 長さ
  {
    取得 { 0 を返します。}
  }

  public override long Position
  {
    get { return _position; }
    { _位置 = 値を設定します。}
  }

  public override long Seek(長いオフセット、System.IO.SeekOrigin 方向)
  {
    return _sink.Seek(オフセット、方向);
  }

  public override void SetLength(長い長さ)
  {
    _sink.SetLength(長さ);
  }

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

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

  public override int Read(byte[] バッファ、int オフセット、int カウント)
  {
    return _sink.Read(バッファ、オフセット、カウント);
  }

  public override void Write(byte[] buffer, int offset, int count)
  {
    string s = System.Text.UTF8Encoding.UTF8.GetString(バッファ、オフセット、カウント);
    正規表現 reg = 新しい Regex(FORM_REGEX, RegexOptions.IgnoreCase);
    一致 m = reg.Match(s);
    if (m.Success)
    {
      文字列形式 = 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 に設定します
  ///
  public static void SetFormAction(string url)
  {
    if (HttpContext.Current != null)
      HttpContext.Current.Response.Filter = new FormActionModifier(HttpContext.Current.Response.Filter, url);
  } // SetFormAction()
} // クラス
于 2012-09-24T15:16:50.660 に答える
0

最近、フォームのアクション属性を投稿すると書き換えられたパスが使用されるという同じ問題がありましたが、生の URL を表示したかったのです。URL書き換えライブラリがインストールされていません。

ポストバックを機能させるには、このページが非常に役立つことがわかりました 。

于 2013-09-13T11:48:43.993 に答える
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 に答える