2010-12-19 13 views
0

私はMVCリストビューのデータリストを表示するためにjQueryテンプレートプラグインを使用しようとしています。しかし、私のリストは、私のmvcアプリケーションのデフォルトのビューです。私は、同じアクションを使用して、jsonデータを返すこととビューを返すことの両方の目的をサーバーにしたいと考えています。ASP.Net MVCリストアクションがJsonデータを返す

データを取得するために2回トリップしています。私のアクションが呼び出されるとすぐにJsonデータを返し、テンプレートプラグインを使用してデータを表示する方法がありますか?

答えて

2

アクションがAJAXと呼ばれてきた場合は、その後、JSONデータを返すと、通常のビュー戻らないかどうかをテストすることができます:もちろん

public ActionResult Index() 
{ 
    var model = FetchModel(); 
    if (Request.IsAjaxRequest()) 
    { 
     return Json(model, JsonRequestBehavior.AllowGet); 
    } 
    return View(model); 
} 

このifがあなたのコントローラのアクションが醜いなります。複数のアクションで、このロジックの繰り返しを避けるためにアクションフィルタを使用することがはるかに良いでしょう。そして、

public class MyFilterAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     base.OnActionExecuted(filterContext); 
     if (filterContext.HttpContext.Request.IsAjaxRequest()) 
     { 
      var viewResult = filterContext.Result as ViewResultBase; 
      if (viewResult != null) 
      { 
       if (viewResult.Model != null) 
       { 
        filterContext.Result = new JsonResult 
        { 
         Data = viewResult.Model, 
         JsonRequestBehavior = JsonRequestBehavior.AllowGet 
        }; 
       } 
      } 
     } 
    } 
} 

そして、この属性を使用してコントローラを飾る:

[MyFilter] 
public ActionResult Index() 
{ 
    var model = FetchModel(); 
    return View(model); 
} 
+0

おかげのようなものを表示します。しかし、これは、私が避けたいサーバーへの2回の往復を持ちます。私はListアクションを介してJsonデータを返し、テンプレートプラグインを介して表示したいと思います。どんな助け? – Ashish

1

Darins偉大な答えにコメントをする私をリードあなたの質問が本当に説明していない以下が必要であると信じています。

私は、HTMLビューを返すだけでなく、JSONオブジェクトが含まれたスクリプトタグを含めることができます...そして、

を、この私の助けを私の本のワイヤを交差していない場合。

あなたに続いて例えば

public static class MvcViewExtensions 
    { 

    public static string toJson(this System.Web.Mvc.HtmlHelper helper, object obj) 
    { 
     JavaScriptSerializer serializer = new JavaScriptSerializer(); 
     return serializer.Serialize(obj); 
    } 
    } 

toJsonのHTMLヘルパー拡張機能を作成しますが、返信のため、この

<html> 

    ...other html stuff 

    <script> 

     var json = <%= Html.ToJson(Model.someProperty) %>; 
     //call to some js to do your templating 
     myapp.someTemplatingFunc(json); 

    </script> 
</html> 
+0

私は失敗しているRazor構文を使って同じコードを試しています。私は次のようにしています: var json = @ Model.ToJson(); – Ashish

+0

よく「失敗しています」という言葉はあまり役に立ちません。モデルにはToJsonメソッドがありますか? – redsquare

+0

いいえ。上記のToJsonの静的クラスは別に用意されています。しかし、コンパイラが@ Model.ToJson()をヒットすると、 "System.Collections.Generic.List 'に' ToJson 'の定義が含まれていないというエラーが発生します。 – Ashish

関連する問題