-2

1つのフォーム(つまり、ページにデータを送信する要素)と複数のASPコントロールを備えたページがあります。ASPコントロールは、データの送信とは関係がなく、無関係なタグは役に立たないよりも悪いという事実にもかかわらず、formタグでラップする必要があります。これには、すべてのコントロールが含まれている必要があります。つまり、有用な作業を行う実際のフォームのタグも含まれます。runat="server"formform

これformには、not-this-pageのメソッドgetとアクションがあり、どちらもASPとうまく連携しません。ASPボイラープレート内に適切なフォームタグをネストしようとしましたが、おそらく仕様で明示的に禁止されているため、ブラウザはそれを取得しません。このフォームのフィールドはJavascriptを介して生成されるため、ASPコントロールに変換することはできません。

この問題を解決するもの:

  • 1ページに複数の役に立たないASPフォームがあるため、スコープを厳密に設定できます。(ASPで禁止)
  • 機能的なフォームがまだ存在できるようにネストされたフォーム(HTMLで禁止)
  • form無駄なクラッドをマークアップにダンプすることなく、空のASPの代わりに使用できる新しいコントロール。(これは可能ですか?)
  • 便利なフォームからタグを削除し、ポストバックでPOSTデータを手動で調べて、GETとして送信する必要があるものを特定してから、リダイレクトします。便利なフォームのあるすべてのページ。
  • 上記を半自動で実行する複雑なシステム。これは、フォームフィールドがASPコントロールではないことを考えると実用的でない場合があります。
  • ASPコントロールを完全に放棄します。

アイデア?

4

1 に答える 1

0

新しいイベントハンドラー:

public void GetRequest(object sender, CommandEventArgs e)
{
    string url = string.IsNullOrEmpty(e.CommandArgument as string)
        ? Request.Url.AbsolutePath
        : (string)e.CommandArgument;

    var query = Request.Form.ToDictionary()
        .Where(kv => kv.Key.StartsWith(e.CommandName + "$"))
        .Select(kv => string.Format("{0}={1}",
            Server.UrlEncode(kv.Key.Substring(kv.Key.IndexOf("$") + 1)),
            Server.UrlEncode(kv.Value)));

    string destination = string.Format("http://{0}{1}{2}{3}",
        Request.Url.Authority,
        Page.ResolveUrl(url),
        query.Any() ? "?" : "",
        string.Join("&", query));

    Response.Redirect(destination);
}

そしてaspxで:

<div class="form" id="filters-form">
    <div><input type="hidden" name="filters$OrderBy" value="<%= Orderings.ToSortString() %>" /></div>
    <fieldset id="filters"><!-- Will be filled in by javascript --></fieldset>
    <fieldset id="controls">
        <div>
            <button type="button" id="add-filter">New Filter</button>
            <asp:Button runat="server" Text="Apply Filters" OnCommand="GetRequest" CommandName="filters" />
        </div>
    </fieldset>
</div>
于 2012-10-03T13:04:39.533 に答える