MVC JsonResultの使い方

5119 ワード

クライアントがアクションメソッドを呼び出し、要求するデータをJSON形式で返す場合、ASP.NET MVCは、CLRオブジェクトをJSON形式に変換して応答するメカニズムを必要とし、これはJsonResultによって解決することができる.MVCでのJsonResultの使い方をご紹介します.
一、MVCにおけるJsonResult定義のコード断片
    public class JsonResult : ActionResult
     {    
         public override void ExecuteResult(ControllerContext context);
      
         public object                 Data { get; set; }  
         public Encoding               ContentEncoding { get; set; }
         public string                 ContentType { get; set; }    
         public JsonRequestBehavior    JsonRequestBehavior { get; set; }    
         public int?                   MaxJsonLength { get; set; }
         public int?                   RecursionLimit { get; set; }
     }
     

     public enum JsonRequestBehavior
     {
        AllowGet,
        DenyGet
     }

 
ここで、JsonResultがobjectタイプを持つ属性Dataは、JSON形式に変換する必要があるデータオブジェクトを表します.属性ContentEncodingとContentTypeは、現在のレスポンスに設定されているエンコード方式とメディアタイプを表し、デフォルトでは「アプリケーション/json」が使用されます.
 
コメント:
セキュリティ上の理由から、JsonResultはデフォルトではHTTP-GETリクエストへの応答として使用できません.この場合、InvalidOperationException異常が直接放出されます.JsonRequestBehaviorプロパティを使用して、HTTP-GETリクエストに対するJsonResultのサポートを開始できます.この属性タイプはJsonRequestBehavior列挙であり、2つの列挙項目AllowGetとDenyGetはそれぞれHTTP-GET要求に対する応答を許可/拒否することを表す.JsonResultのJsonRequestBehaviorプロパティは初期化時にDenyGetに設定され、作成したJsonResultでHTTP-GETリクエストに応答する必要がある場合は、JsonRequestBehaviorプロパティをAllowGetに明示的に設定する必要があります.
 
二、ControllerでJsonResultを返す方法
 
抽象クラスControllerでは、指定されたデータオブジェクト、符号化方法、およびJsonRequestBehaviorに基づいて対応するJsonResultを作成するための一連のJsonメソッドも定義される. 
   public abstract class Controller : ControllerBase,...
     {
         //    
         protected internal JsonResult Json(object data);
         protected internal JsonResult Json(object data, string contentType);
         protected internal JsonResult Json(object data, JsonRequestBehavior behavior);
         protected internal virtual JsonResult Json(object data, string contentType, Encoding contentEncoding);
         protected internal JsonResult Json(object data, string contentType, JsonRequestBehavior behavior);
         protected internal virtual JsonResult Json(object data, string contentType, Encoding contentEncoding, JsonRequestBehavior behavior);
     }

三、MVC JsonResultの例
 
1、ビューページ



    Index2
    
    
        var login = function () {
            var data = { "username": $.trim($("#username").val()), "pwd": $.trim($("#pwd").val()) }

//            $.post("/Home/Login", data, function (message) {
//                if (message.success) {
//                    alert(message.msg);
//                }
//                else {
//                    alert(message.msg);
//                }
//            }, "json");

            $.ajax({ type: "post", url: "/Home/Login", data: data, success: function (message) {
                if (message.Success) {
                    alert(message.Msg);
                }
                else {
                    alert(message.Msg);
                }
            }, dataType: "json"
            });
        }
    


    
    

Login

Username:
Userpass:

2、コントローラ
using System.Web.Mvc;

namespace Mvc1.Controllers
{
    public class HomeController : Controller
    {
        //
        // GET: /Home/

        public ActionResult Index()
        {
            return View();
        }
        //
        // GET: /Home/Index2
        public ActionResult Index2()
        {
            return View();
        }

        // Post: /Home/Login
        [HttpPost]
        public JsonResult Login()
        {
            string username=Request["username"];
            string pwd = Request["pwd"];

            message msg = null;

            if (username == "rain" && pwd == "m123")
            {
                msg = new message(true, "Success");
            }
            else
            {
                msg = new message(false, "Fail");
            }

            return Json(msg);
        }
    }

    class message
    {
        bool success;
        string msg;

        public message(bool success, string msg)
        {
            this.success = success;
            this.msg = msg;
        }

        public bool Success
        {
            get { return success; }
            set { success = value; }
        }
        public string Msg
        {
            get { return msg; }
            set { msg = value; }
        }
    }
}