【问题标题】:How to return a list of dictionary objects from MVC Controller to Jquery?如何将字典对象列表从 MVC 控制器返回到 Jquery?
【发布时间】:2015-10-18 23:01:17
【问题描述】:

我在将返回的字典对象列表获取到 Jquery 时遇到问题。我的要求是用我从 mvc 控制器中的 GetUser() 获得的用户列表填充 userOptions 数组。以下 $.ajax 调用返回错误。

                    var userOptions = new Array();                   
                    $.ajax({
                       url: '/User/GetUsers',
                       type: 'GET',
                       dataType: "json",
                       contentType: 'application/json; charset=utf-8',
                       async: false,
                       cache: false,
                       success: function(data){
                           $.each(data, function (id, user){
                               userOptions.push(user.NAME);
                            });
                            alert(userOptions);
                        },
                        error: function(xhr){
                          alert("Error:" + "Failed to retrieve.");
                        }                          
                    });

下面是mvc Controller中的方法。来自 jquery 的 $.ajax 调用命中此方法,该方法也按预期返回用户列表,但是,在 jquery success: function(data) 中失败并且 error: function(xhr ) 显示出来。

[HttpGet]
public JsonResult GetUsers()
{
        List<tblUsers> usersList = userContext.Users;
        var users = new List<Dictionary<Guid, string>>();                   
        foreach (var u in usersList)
        {
               var userObj = new Dictionary<Guid, String>();
               userObj.Add(u.ID, u.NAME);
               users.Add(userObj);                         
        }

       return Json(new { JsonUsers = users }, JsonRequestBehavior.AllowGet);           
}

我还将 $.ajax 调用替换为以下 $.getJSON 调用。结果是一样的。它没有成功 - 没有返回任何内容。

 var userOptions = new Array();        
 $.getJSON("/User/GetUsers", 
     function( data ){
           $.each(data, function (id, user){
                optionValues.push(user.NAME);
           });
           alert(userOptions);
     });

我在这里缺少什么?感谢您的帮助。谢谢!

【问题讨论】:

    标签: jquery ajax asp.net-mvc


    【解决方案1】:

    尚不清楚您为什么要为此使用字典。可以很简单

    [HttpGet]
    public JsonResult GetUsers()
    {
      var data = userContext.Users.Select(u => new
      {
        ID = u.ID,
        Name = u.NAME
      });
      return Json(data, JsonRequestBehavior.AllowGet);           
    }
    

    在脚本中你可以使用

    var userOptions = new Array();      
    // don't hard code your url's  
    $.getJSON('@Url.Action("GetUsers", "User")', function( data ){
      $.each(data, function (index, user){
        optionValues.push(user.Name);
      });
    });
    

    旁注:不清楚为什么您从不使用用户 ID 值时将其发送给客户端?

    【讨论】:

    • 谢谢,斯蒂芬!我仍然无法使用您上面建议的 sn-p 在 jquery 中获取列表。它命中 GetUsers() 方法,从控件返回列表,但在 jquery 中,即使进行了上述更改,它也返回空列表。要更新其他控件,需要包含 ID 值。
    • 返回空列表的唯一方法是userContext.Users 不包含任何项目。你检查过var data实际上包含一些值吗?
    • 谢谢斯蒂芬!你的指导确实帮助了我。一些有线原因,直接返回匿名或字典对象列表作为 Jason 对象在我的情况下不起作用。因此,我将列表转换为逗号分隔的字符串值,然后将其作为 Jason 对象返回。
    • @jcisood,绝对没有理由这样做(以及这样做的糟糕做法)正如您从 DotNetFiddle 中看到的那样,它有效,所以如果它不适合您,那么您正在做其他问题(你应该解决这个问题)
    • 是的——它在 DotNetFiddle 中工作。我无法弄清楚为什么它会导致我拥有的 .js 文件出现问题。所以,我放弃了,使用了 string.Join()。
    【解决方案2】:

    已解决:只需按以下方式更改即可解决我的问题。谢谢@Stephen!

    [HttpGet]
    public ActionResult GetUsers()
    {
      string strUsers = "";  
      var data = userContext.Users.Select(u => new
      {
        ID = u.ID,
        Name = u.NAME
      });
      strUsers = string.Join(", ", data.Select(m => m.ID + ":" + m.Name).ToArray()); 
      return Json(strUsers, JsonRequestBehavior.AllowGet);           
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-13
      • 1970-01-01
      • 1970-01-01
      • 2021-12-26
      • 2017-06-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多