【问题标题】:Return a JSon array to $.ajax from ActionResult type method in MVC 3从 MVC 3 中的 ActionResult 类型方法返回一个 JSON 数组到 $.ajax
【发布时间】:2011-11-01 07:31:19
【问题描述】:

我有一个 TreeView 助手,它获取类别列表及其链接。我是这样做的

@helper TreeView(FavouriteLinksXmlMVC3.Controllers.HomeController cat)
{
   cat = new FavouriteLinksXmlMVC3.Controllers.HomeController();
     try
     {
      foreach(FavouriteLinksXmlMVC3.Models.CategoriesControl list_category in cat.Categories)
      {
          <li>
          <span class="folder" id="@list_category.Name">@list_category.Name</span>

         @if(list_category.hasChild)
         {
              <ul>
              @foreach(var links in list_category.Links)
              {
               <li><span class="file" id="@links.Url" categ_name="@list_category.Name">@links.Name</span></li>  
              }
              </ul>
         }
         </li>
      }
      }
      catch(Exception e)
      {
         Response.Write( e.ToString() );
      }    
}

很好。它的工作就像一个魅力。

我做了一个函数,它使用 JQuery 获取链接信息:

 $(".file").click(function () {
         $.ajax({
            url: '@Url.Action("GetLinkInfo")',
            data: { cat_name: $(this).attr("categ_name"), url: $(this).attr("id") },
            type: "GET",
            success: function (data) {
               //alert(data.Name + " " + data.Url + " " + data.Description);
               var make = "<table style='border-collapse:collapse' border='1'><tr><td>Name:</td><td>" + data.Name + "</td></tr><tr><td>Url:</td><td>" + data.Url + "</td></tr><tr><td>Description</td><td>" + data.Description + "</td></tr></table>";
               $("#details").html(make);
            }
         });
      });

还有GetLinkInfo

[HttpGet]
       public ActionResult GetLinkInfo( string cat_name, string url ) {
          if ( string.IsNullOrEmpty( cat_name ) )
             throw new ArgumentNullException( "GetLinkInfo cat_name" );
          if ( string.IsNullOrEmpty( url ) )
             throw new ArgumentNullException( "GetLinkInfo url" );

          var c = this.Categories.Find( x => x.Name == cat_name );
          string name1="", url1="", descr1="";
          bool done = false;

          if ( c != null ) {
             foreach ( var p in c.Links ) {
                if ( p.Url == url ) {
                   name1 = p.Name;
                   url1 = p.Url;
                   descr1 = p.Description;
                   done = true;
                   break;
                }
             }
          }

          if ( done ) {
             return Json(
                new {
                   Name = name1,
                   Url = url1,
                   Description = descr1
                },
                JsonRequestBehavior.AllowGet
                );
          } else {
             return View();
          }
       }

我解决了这个问题

[HttpGet] //controller
       public JsonResult GetCategoryInfo( string cat_name ) {
          if ( string.IsNullOrEmpty( cat_name ) )
             throw new ArgumentNullException( "GetCategoryInfo cat_name" );

          var c = this.Categories.Find( x => x.Name == cat_name );

          if ( c != null ) {
             List<LinksControl> lk = null;
             if ( c.hasChild ) {
                lk = new List<LinksControl>();

                foreach ( var p in c.Links ) {
                   lk.Add( p );
                }
             } else {
                lk = new List<LinksControl>( 0 );
             }
             return this.Json(lk,JsonRequestBehavior.AllowGet);
          } else {
             return this.Json(new List<LinksControl>( 0 ),JsonRequestBehavior.AllowGet);
          }

       }

还有 JQuery

$(".folder").click(function() {
   var find_id = $(this).attr("id");

$.ajax({
           type: "GET",
           url: '@Url.Action("GetCategoryInfo")',
           dataType : 'json',
           data: { cat_name: find_id },
           success: function (response) {
             // $("#details").html(response.toString());


              var make = "<table style='border-collapse:collapse' border='1'>";
              make += "<tr><td>Name</td><td>Url</td><td>Description</td></tr>";

               $.each(response, function (index, lk) {
              make += "<tr><td>" + lk.Name + "</td><td>" + lk.Url + "</td><td>" + lk.Description + "</td></tr>";
              });


              make += "</table>";
              $("#details").html(make);
           }
        });
          });

【问题讨论】:

  • 这会返回什么var c = this.Categories.Find( x =&gt; x.Name == cat_name );
  • Categories is a generic List show c 将返回一个 CategoriesControl(它是 Models 中定义的类)数据类型,带有他的名字和他的链接列表。

标签: c# jquery asp.net-mvc ajax asp.net-mvc-3


【解决方案1】:

尝试将public ActionResult GetCategoryInfo() 更改为public JsonResult GetCategoryInfo()

我认为ActionResult 返回类型可能会导致问题,但这只是一种预感!

【讨论】:

  • 您是否已逐步确保将结果填充到服务器上?
  • 是的,使用调试器,现在它可以工作了。我再次更新了最新的两个代码(控制器和 JQuery)。我错过了DataType : 'json'
  • JsonResult 派生自 ActionResult 所以不会有任何区别
  • @mattytommo 你是对的,这就是为什么我说这是一种预感。我想也许 JsonResult 会包含解析 json 所需的一些属性/方法。
猜你喜欢
  • 2018-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 2011-02-12
相关资源
最近更新 更多