2012-04-19 14 views
2

私は、サーバーにajax呼び出し(jQueryを使用)を行うメインWebページ( "Base Page")を持っています。サーバー側のページ(「Ajaxページ」)はASP.NETのWebフォームです(ここではMVCは使用していません)。 (この場合)私はAjaxレスポンス内でデータをレンダリングするためにGridViewを使用しているので、<フォームrunat = "server" >タグを含める必要があります。ASP.NETとajaxレスポンス

ベースページがAJAXレスポンスを受け取るとDOMに挿入されますが、AJAXレスポンスは<フォーム>タグを含むHTMLマークアップで構成されているため、入れ子になったHTMLフォーム、それは悪いです。

jqueryを使用すると、ベースページDOMに応答のフラグメントを挿入することができます。または、jqueryを使用して、その後<フォーム>タグを削除することができます。しかし、これらは、きちんとした回避策のように感じます。実際にASP.NETページが<フォーム>タグを使用して応答を出さないようにする方法はありますか?フォームタグはASP.NET Webフォームモデルの心臓部ですが、ASP.NETでAJAXを使用すると複雑な事態になります。確かに、Microsoftはポストバック/サーバーサイドモデルが過去のものであることを認識していますか?

Microsoftには、おそらくこの問題に対処するいくつかのサーバーサイドAJAXライブラリがありますが、ASP.NET Webフォームにネイティブなソリューションがあるかどうかはまだ分かりません。

提案がありますか?

+5

これは本当に役立つコメントではありませんが、この質問はWebフォームを嫌う理由を強調しています。出力を制御するのは難しいです。クライアントに送信されるもののバイトレベルの制御が必要です。 – RedFilter

答えて

3

次のような文字列にWebユーザーコントロールにあなたのGridViewを追加し、それをレンダリングすることができます。これは、あなたがページにあなたのAjaxのリクエストをポイントする必要がないことを意味

public static string ExecuteToString(this Control control) 
{ 
    Page page = new Page(); 
    page.Controls.Add(control); 

    StringBuilder sb = new StringBuilder(); 
    using (StringWriter writer = new StringWriter(sb)) 
    { 
     HttpContext.Current.Server.Execute(page, writer, false); 
    } 
    return sb.ToString(); 
} 

。 Webサービスを使用することができます。特定のメソッドを照会し、ユーザーコントロールを動的にロードし、文字列にレンダリングしてHTMLを返します。 HTMLとコードをユーザーコントロールに置くので、フォームタグを取り除くことを心配する必要はなく、ページ上でのようにすべてのaspコントロールを使用することができます。

私はこの方法を使用することのパフォーマンスコストについては考えていませんが、私はしばらくそれを使用してきました。私は、問題の同じ種類を扱った

+0

うーん...興味深い。これは単にトリックを行うかもしれません。 VBでこれを書く方法を知っていますか? – Octavient

+0

いいえ、私は恐れていません - 申し訳ありません。ちなみに、これは拡張として設定されているので、どのコントロールでもメソッドとして呼び出すことができます。 – Jon

+0

こんにちは@Jon - [これについての任意の提案(http://stackoverflow.com/q/34003053/2404470) – xameeramir

3

WebFormsを使って作業する& AJAXは何年もあなたの欲求不満を理解しています。私はページをロードするとき、私はちょうどこのajaxクラスを呼び出すその後

<html> 
    <head></head> 
    <body> 
     <form runat="server"> 
     <div class="ajax"> 
      Content here.. 
     </div> 
     </form> 
    </body> 
</html> 

:jQueryのAJAXを使用してロードするWebフォームページでの作業時

は通常、私は、フォーム内にネストされ、私のページの周りajaxクラスをラップ:

$("element").load("http://domain.com/webpage.aspx .ajax"); 

これはform要素がネストされたフォームの問題を防止し、私のページにレンダリングされていないことが、あなたのGridViewはまだ成功したHTMLにレンダリングすることができます。

+0

ご返信ありがとうございます。はい、これは私が応答の断片を挿入することによって意味されました。ここでは2つの懸念事項があります:a)これはダウンストリームの回避策のように感じます(私はちょうどそれと一緒にいなければならないと思うが)。b)jqueryのloadメソッドでセレクタを使用すると、ajaxレスポンスが発生しない場合があります(これは、すべてのスクリプトがベースページのAJAXロードのコールバック関数の一部になるわけではありません)。 – Octavient

+0

ありがとう、ちょうど私が探していたもの。 jqueryを使用している場合は、新しく追加する要素にイベントをアタッチするには、 "on"メソッドを使用する必要があります。 http://api.jquery.com/on/ –

0

ajaxサーバーページがaspxページ(例:ajaxpage.aspx)である場合、ajaxpage.aspx内のHTML makupを削除して、Pageディレクティブを記述する最初の行を除くことができます。だからこのようなものに違いないはずです。

<%@ Page Language="C#" CodeBehind="ajaxpage.aspx.cs" Inherits="MyProject.ajaxpage" %> 

そして、背後にあるコードでは、あなたはそれが(クリーン)HTMLマークアップ/データの一部のいくつかの種類を返すことであるならば、私はResponse.Writeを

protected void Page_Load(object sender, EventArgs e) 
{ 
    Response.Write("your markup to return here"); 
} 

を使用してデータを返すことができますあなたがASHXファイルにASP.NETサーバーコントロールを使用することはできません代わりのaspxファイルのファイルとその

public void ProcessRequest(HttpContext context) 
{ 
    context.Response.ContentType = "text/plain"; 
    context.Response.Write("<h3>Here is the Markup for UserDetails</h3>"); 
} 

からデータを返す:generic handlerajaxresponse.ashx EX)を使用する傾向。また、フォームタグなしでサーバーコントロール(例:GridView)を持つページを持つことはできません。フォームタグ内に配置する必要があります。 gridviewのようなサーバーコントロールは、HTMLテーブルマークアップだけをレンダリングすることに注意してください。個人的に

私はアヤックス、私はASHXハンドラを使用し、出力に自分の必要なマークアップを私のコードを記述します使用して私の現在のページに注入/見せたい&一部クリーン制御HTMLマークアップを取得したい場合。 ASHXファイルはaspxファイルと比較してパフォーマンス上の利点があります。通常のASPXページのライフサイクル(これらすべてのイベント!

+0

ありがとう、Shyju。あなたのresponse.writeの提案のために、私はgridviewのようないくつかのコントロールを使うことができないのではないでしょうか?データをグリッドビューにバインドしてから、response.writeをグリッドビューに書き出す方法はありますか?あなたのASHXの提案にも同じ質問があります - これらのグリッドビューのようなコントロールを使用できますか? – Octavient

+0

@Octavient:私は自分の答えを更新しました。 ashxファイルでサーバーコントロールを使用することはできません。きれいなhtmlとコントローラのHTMLが必要な場合は、ashxを使用します。 – Shyju

1

が、私はそれを次のように解決:

Response.Write("whatever content") 
Response.End() 

をこれは、あなたが「Response.Writeを()」に入れて何...あなたはまだだONLY送信しますヘッダーなどを自由に変更することができます。