パラメータに応じて JSON または部分的な HTML を返すコントローラ アクションを作成しようとしています。結果を MVC ページに非同期的に返す最良の方法は何ですか?
11 に答える
アクション メソッドで Json(object) を返し、JSON をページに返します。
public ActionResult SomeActionMethod() {
return Json(new {foo="bar", baz="Blech"});
}
次に、Ajax を使用してアクション メソッドを呼び出すだけです。次のような ViewPage のヘルパー メソッドの 1 つを使用できます。
<%= Ajax.ActionLink("SomeActionMethod", new AjaxOptions {OnSuccess="somemethod"}) %>
SomeMethod は、返された Json オブジェクトを評価する JavaScript メソッドになります。
プレーンな文字列を返したい場合は、ContentResult を使用できます。
public ActionResult SomeActionMethod() {
return Content("hello world!");
}
デフォルトでは、ContentResult は contentType として text/plain を返します。
これはオーバーロード可能であるため、次のこともできます。
return Content("<xml>This is poorly formatted xml.</xml>", "text/xml");
リクエストの AcceptTypes を考慮する必要があると思います。現在のプロジェクトでそれを使用して、次のように正しいコンテンツ タイプを返しています。
コントローラーでのアクションは、リクエスト オブジェクトと同じようにテストできます。
if (Request.AcceptTypes.Contains("text/html")) {
return View();
}
else if (Request.AcceptTypes.Contains("application/json"))
{
return Json( new { id=1, value="new" } );
}
else if (Request.AcceptTypes.Contains("application/xml") ||
Request.AcceptTypes.Contains("text/xml"))
{
//
}
次に、ビューの aspx を実装して、部分的な xhtml 応答のケースに対応できます。
次に、jQuery で型パラメーターを json として渡して取得できます。
$.get(url, null, function(data, textStatus) {
console.log('got %o with status %s', data, textStatus);
}, "json"); // or xml, html, script, json, jsonp or text
これがジェームズに役立つことを願っています
JSON データを処理するもう 1 つの優れた方法は、JQuery の getJSON 関数を使用することです。あなたは呼び出すことができます
public ActionResult SomeActionMethod(int id)
{
return Json(new {foo="bar", baz="Blech"});
}
単純にjquery getJSONメソッドからのメソッド...
$.getJSON("../SomeActionMethod", { id: someId },
function(data) {
alert(data.foo);
alert(data.baz);
}
);
JQuery を使用して MVC ajax GET 呼び出しを実装するいくつかの問題が見つかり、頭痛の種となったので、ここで解決策を共有します。
- ajax 呼び出しにデータ型「json」を必ず含めてください。これにより、返された JSON オブジェクトが自動的に解析されます (サーバーが有効な json を返す場合)。
JsonRequestBehavior.AllowGet
; を含めます。この MVC がないと、HTTP 500 エラーが返されました (dataType: json
クライアントで指定されています)。cache: false
$.ajax 呼び出しに追加しないと、最終的に (HTTP 200 応答ではなく) HTTP 304 応答が返され、サーバーは要求を処理しません。- 最後に、json では大文字と小文字が区別されるため、要素の大文字と小文字はサーバー側とクライアント側で一致する必要があります。
サンプル JQuery:
$.ajax({
type: 'get',
dataType: 'json',
cache: false,
url: '/MyController/MyMethod',
data: { keyid: 1, newval: 10 },
success: function (response, textStatus, jqXHR) {
alert(parseInt(response.oldval) + ' changed to ' + newval);
},
error: function(jqXHR, textStatus, errorThrown) {
alert('Error - ' + errorThrown);
}
});
サンプル MVC コード:
[HttpGet]
public ActionResult MyMethod(int keyid, int newval)
{
var oldval = 0;
using (var db = new MyContext())
{
var dbRecord = db.MyTable.Where(t => t.keyid == keyid).FirstOrDefault();
if (dbRecord != null)
{
oldval = dbRecord.TheValue;
dbRecord.TheValue = newval;
db.SaveChanges();
}
}
return Json(new { success = true, oldval = oldval},
JsonRequestBehavior.AllowGet);
}
質問の残りの半分に答えるには、次のように呼び出します。
return PartialView("viewname");
部分的な HTML を返したい場合。おそらく URL 部分/パラメーターに基づいて、リクエストが JSON と HTML のどちらを必要とするかを判断する方法を見つける必要があります。
これを非常にうまくカバーしているこの非常に役立つ記事をご覧になることをお勧めします。
この問題に対する適切な解決策を探している人々に役立つかもしれないと思っただけです.
http://weblogs.asp.net/rashid/archive/2009/04/15/adaptive-rendering-in-asp-net-mvc.aspx
MVC 3 にアップグレードした人には、 MVC3 と Json を使用する適切な方法があります。