使用JQuery ajax将控制器数据作为段落插入div中

时间:2018-05-23 05:20:07

标签: c# ajax asp.net-mvc controller

我有一个从模型中检索数据的控制器,并希望添加在div中检索的每一位数据,其中数据是div中的一个段落,但是我无法使其工作。 / p>

这是我的控制者:

namespace MyGamesProject.Controllers
{
public class GamesController : ApiController
{
    private GamesDBEntities db = new GamesDBEntities();

    // GET: api/Games
    public IQueryable<object> GetAllGames()
    {
       var games = db.Games.Include(d => d.DailyDatas)
                    .GroupBy(d => new { d.name, d.year })
                    .OrderBy(d => d.Key.name)
                    .Select(d => new
                    {
                        d.Key.year,
                        d.Key.name
                    }
                    );
        return games;
    }

}
}

这是我在cshtml视图页面中使用的ajax:

<div id="test"></div>

@section Scripts {
<script>
    $.ajax({
        url: "/api/Games/",
        method: "GET",
        dataType: 'json',
        success: success
    });

    function success(data)
    {
        $.each(data, function (i, val)
        {
            var $data = $('<p>' + val.name + ' ' + ' was released in ' + val.year + '</p>')
            $data.appendTo($('#test'));
        });
    }
</script>
}

当加载页面时,页面是空白的并且在div中添加检索到的数据作为段落似乎没有用,我不确定它为什么不起作用。我是否错误地构建了测试div中的段落,或者将它们插入错误的位置?任何帮助都会很棒。

3 个答案:

答案 0 :(得分:1)

变量games仍然是LINQ查询。您需要在其上调用ToList()ToArray(),以便执行查询并为您提供结果项。

public IEnumerable<object> GetAllGames()
{
   var games = db.Games.Include(d => d.DailyDatas)
                .GroupBy(d => new { d.name, d.year })
                .OrderBy(d => d.Key.name)
                .Select(d => new
                       {
                        d.Key.year,
                        d.Key.name
                       }
                );
    return games.ToList();
}

这里,由于我们调用ToList方法,该方法的返回值是匿名对象列表(具有年份和名称属性)。所以我们必须将方法的返回类型更改为IEnumerable<object>

您可以打开浏览器devtools(F12) - &gt;网络标签,查看正在进行的ajax通话及其响应。如果关于url和路由的一切都很好,你应该在响应体中看到带有json数组的200 OK响应。如果您看到404,则表示您的客户端代码尝试访问的网址未正确设置路由。如果您看到500,则表示您的服务器代码已被调用,但由于在执行代码期间发生了一些异常而导致崩溃。您可能会在响应选项卡中看到异常详细信息。

此外,您当前的代码正在循环内执行jquery选择器$('#test')。您可以通过在循环外缓存容器元素选择器来改进它。

function success(data) {
    var $container = $('#test');
    var items = '';
    $.each(data, function (i, val) {
        items += '<p>' + val.name + ' ' + ' was released in ' + val.year + '</p>';
    });
    $container.append(items);
}

答案 1 :(得分:0)

当您致电/api/Games/网址时,默认情况下API调用Get方法在您的API中。如果要覆盖它,则需要URL路由。如果继续GetAllGames(),则使用属性路由或在WebApiConfig.cs文件中写入路由。 (另请参阅下面的 @Shyju 评论)

此外,变量games是一个LINQ查询,您需要调用ToList()来执行数据。

控制器:

namespace MyGamesProject.Controllers
 {
    public class GamesController : ApiController
    {
         public IHttpActionResult Get(long id)
         {
            var games = db.Games.Include(d => d.DailyDatas)
                         .GroupBy(d => new { d.name, d.year })
                         .OrderBy(d => d.Key.name)
                         .Select(d => new
                         {
                          d.Key.year,
                          d.Key.name
                         }).ToList();

         return Ok(games);
      }    
     }
    }

查看页面:

<div id="test"></div>

@section Scripts {
 <script>
  $(function () {
    $.ajax({
        url: "/api/Games/",
        method: "GET",
        dataType: 'json',
        success: success
    });

    function success(data)
    {
        $.each(data, function (i, val)
        {
            var $data = $('<p>' + val.name + ' ' + ' was released in ' + val.year + '</p>')
            $data.appendTo($('#test'));
        });
    }
});
</script>
}

答案 2 :(得分:0)

  

IQueryable只是一个查询。它不会产生结果。附加   tolist()。在这种情况下,它没有给你结果bcoz没有   数据库上下文触发IQueryable。数据库上下文被处理掉了   时刻控制去了。

校正

namespace MyGamesProject.Controllers
{
    public class GamesController : ApiController
    {
        private GamesDBEntities db = new GamesDBEntities();

        // GET: api/Games
        public IHttpActionResult GetAllGames()
        {
            var games = db.Games.Include(d => d.DailyDatas)
                         .GroupBy(d => new { d.name, d.year })
                         .OrderBy(d => d.Key.name)
                         .Select(d => new
                         {
                             d.Key.year,
                             d.Key.name
                         }
                         ).ToList();
            return Ok(games);
        }

    }
}