getJSON 和 parseJSON

<script src="@Url.Content("~/Scripts/jquery.json-2.3.min.js")" type="text/javascript"></script>


@using (Html.BeginForm("ForList", "CSOT", FormMethod.Post))
{
    <div>
        <fieldset>
            <legend>CSOT List Type</legend>
            <p>
                Please select the target item in the dropdown box:
            </p>
            <div id="list" class="editor-label">
            </div>
            <div class="editor-label">
            <input type="submit" style = "width:200px" value="Continue"/>
            </div>
         </fieldset>
     </div>
}


<script type="text/javascript">

        //获取JSON字符串,创建 select 标签
        $.getJSON("ForListTypeValue", function (data) {

          

           //如果 data 是 JSON 字符串, 必须将它转换为对象字面量
            var objJSON= $.parseJSON(data);


            var selectItems = "";
            $.each(objJSON.listtype, function (i, item) {
                selectItems += '<option value="' + item.value+ '">' + item.text+ '</option>';
            });
            selectItems = '<select id="listType">' + selectItems + '</select>';

 

            //添加 select 标签
            $("#list").html(selectItems);
        });
</script>

 

===========================================================

 

public ActionResult ForListTypeValue()
{

            //以JSON字符串作参数,比较特殊,在 callback function 中,需要对data进行 $.parseJSON(data)
            return Json("{\"listtype\":[" + string.Join<string>(",", new Models.CSOTModel(Server.MapPath("~")).ListType.Select(n =>  "{\"text\":\""+n.Text+"\",\"value\":\""+n.Value+"\"}")) + "]}", JsonRequestBehavior.AllowGet);
}

 

但正常情况下,JsonResult 是将对象(非JSON字符串)转换为JSON字符串,并且Response.ContentType="application/json",

这样在callback function 中的 data 就是对象字面量,不需要再使用 $.parseJSON(data) 进行转换。

如果Response.ContentType="text/plain",则不能再进行转换为JSON字符串,

而是直接输出,在 callback function 中 也不需要对data 进行 $.parseJSON(data)。

 (ContentType是什么在$.getJSON中没什么效果,而在$.ajax中就有作用了)

自定义ActionResult:

public class StringResult:ActionResult
    {
        string _data { get; set; }

        public StringResult(string data)
        {
            _data = data;
        }
        public override void ExecuteResult(ControllerContext context)
        {
            if(context==null)
                throw new NotImplementedException();

            context.HttpContext.Response.ContentType = "text/plain";

            //JsonResult中使用的序列化,在这不能使用

            //JavaScriptSerializer serializer = new JavaScriptSerializer();

            //context.HttpContext.Response.Write(serializer.Serialize(_data)); 转换为JSON字符串

            context.HttpContext.Response.Write(_data);   //直接输出    

         }
    }

 

这样可以修改为:

public ActionResult ForListTypeValue()
{

        return new StringResult("{\"listtype\":[" + string.Join<string>(",", new Models.CSOTModel(Server.MapPath("~")).ListType.Select(n =>  "{\"text\":\""+n.Text+"\",\"value\":\""+n.Value+"\"}")) + "]}");
}

 

也要修改 callback function 中的

var objJSON= $.parseJSON(data);

var objJSON= data;

 

再次请求, $.getJSON 会取缓存数据,如果需要取消数据输出缓存,则在Action上加上

[OutputCache(Duration = 0, VaryByParam = "None")]


 

 

 

posted @ 2012-05-25 10:04  Yu  阅读(18000)  评论(0编辑  收藏  举报