ExtJS:如何使用asp.net mvc返回带有数据的json成功

时间:2009-09-26 19:51:04

标签: c# asp.net-mvc json extjs

我正在尝试将ExtJS与Asp.Net MVC一起使用,到目前为止一切正常。 (对ExtJS的好工作) 为了简化操作,我需要一些帮助将数据从.net返回到ExtJS。

ExtJS希望在JSON Respone中看到成功标志以及其他数据。

样本预期响应格式类似于

{success:true,data:{id:3,text:“hello world}}

所以,使用linq2sql或ado.net数据集作为模型对象,您是否知道如何轻松以此格式返回数据。

这样的东西
public JsonResult Index()
{
  result.success= true;
  result.obj = repository.FindAllUsers();
  return Json(result)
}

顺便说一下会有用吗?如果我有一个具有bool成功和对象数据属性的ExtJSResult类?

提前致谢

3 个答案:

答案 0 :(得分:12)

试试这个...

public JsonResult Index()
{
    var json = new
    {
        success = true,
        data = from user in repository.FindAllUsers().AsQueryable()
               select new
               {
                   id = user.Id,
                   name = user.Name,
                   ...
               }
    };
    return Json(json);
}

答案 1 :(得分:0)

我使用的是Newtonsoft.Json以及Rick Strahl的一些代码,它们有助于序列化Data对象。 他原来的帖子是:http://www.west-wind.com/Weblog/posts/471835.aspx

    public class ExtJSJsonResult : JsonResult
    {
        public bool success { get; set; }
        public string msg { get; set; }

        public override void ExecuteResult(ControllerContext context)
        {
            if (context == null){
                throw new ArgumentNullException("context");}

            HttpResponseBase response = context.HttpContext.Response;

            if (!String.IsNullOrEmpty(ContentType))
            {
                response.ContentType = ContentType;
            }
            else
            {
                response.ContentType = "application/json";
            }
            if (ContentEncoding != null)
            {
                response.ContentEncoding = ContentEncoding;
            }
            if (Data != null)
            {
                Type type = Data.GetType();
                response.Write(String.Format("{{success: true, msg: \"{0}\", data:", msg));
                if (type == typeof(DataRow))
                    response.Write(JSonHelper.Serialize(Data, true));
                else if (type == typeof(DataTable))
                    response.Write(JSonHelper.Serialize(Data, true));
                else if (type == typeof(DataSet))
                    response.Write(JSonHelper.Serialize(Data, true));
                else
                {
                    JavaScriptSerializer serializer = new JavaScriptSerializer();
                    response.Write(serializer.Serialize(Data));
                }
                response.Write("}");
            }
        }
    }

使用它

public ExtJSJsonResult View(int id)
{
    bool success;
    string msg;
    DataRow dr=null;
    try
    {
        dr = DBService.GetRowById("oc.personeller", id);
        success = true;
        msg = "all ok";
    }
    catch (Exception ex)
    {
        success = false;
        msg = ex.Message;
    }

    return new ExtJSJsonResult
    {
        success= success,
        msg = msg,
        Data = dr
    };

}

我希望这对我以外的人有用。

答案 2 :(得分:0)

我将@ Wellingtonanswer与VS2010(beta2)和MVC 2(beta)一起使用,并出现以下错误:

方法'System.String ToString(System.String)'没有支持的SQL转换。

我认为,这是一个序列化问题(?)

这是我改变它以使其工作的原因..

public JsonResult Index()
{
    var json = new
    {
        success = true,
        data = from user in repository.Users
               select new JsonUser(user)
    };
    return Json(json);
}

JsonUser是一个简单的,可序列化的对象 - 我从@ podcastScott Hanselman得到了这个想法

以下是JsonUser

的示例
public class JsonUser
{
    public long id { get; set; }
    public string name { get; set; }
    public string dateJoined { get; set; }
    ...

    public JsonUser(User user)
    {
        id = user.ID;
        name = user.Name;
        dateJoined = user.DateJoined.ToString("yyyy-MM-dd");
        ...
    }
}