2012-01-10 97 views
1

我知道这个网站上有几个相同的问题,但即使他们提供了解决方案,我也找不到它。我正在尝试实现jQuery UI自动完成功能来获取搜索功能。ASP MVC vs jQuery UI自动完成

我的控制器:

public JsonResult search(int maxRows, string name_startsWith) 
    { 
     DataContext db = new DataContext(); 
     var result = (from p in db.Users where p.UserName.Contains(name_startsWith) || p.FirstName.Contains(name_startsWith) || p.LastName.Contains(name_startsWith) orderby p.LastName select p).Distinct().Take(maxRows).ToList(); 
     return Json(result); 
    } 

我的看法是:

$("#search").catcomplete({ 
    source: function (request, response) { 
     $.ajax({ 
      url: "/h/search", 
      dataType: "json", 
      data: { 
       maxRows: 15, 
       name_startsWith: request.term 
      }, 
      success: function (data) { 
       response($.map(data, function (item) { 
        return { 
         label: item.UserName, 
         value: item.UserId, 
         categoty: "People" 
        } 
       })); 
      } 
     }); 
    } 
}); 

所以,你可以理解;我正在尝试实施类别版本。我很担心这个价值项目。我使用Guid作为UserId。

在此先感谢您的帮助。

EDIT

我通过改变控制取得了一些进展,并查看如下。

控制:

[HttpPost]  
public JsonResult search(int maxRows, string name_startsWith) 
    { 
     DataContext db = new DataContext(); 
     var result = new List<User>(); 
     result = (from p in db.Users where p.UserName.Contains(name_startsWith) || p.FirstName.Contains(name_startsWith) || p.LastName.Contains(name_startsWith) orderby p.LastName select p).Take(maxRows).ToList(); 
     return Json(result, JsonRequestBehavior.AllowGet); 
    } 

查看:

$("#search").catcomplete({ 
     source: function (request, response) { 
      $.ajax({ 
       type: "POST", 
       cache: false, 
       dataType: "json", 
       url: '@Url.Action("search", "h")', 
       data: { maxRows: 15, name_startsWith: request.term }, 
       complete: function (data) { 
        response($.map(data, function (item) { 
         return { 
          label: item.UserName, 
          category: 'People' 
         } 
        })); 
       } 
      }); 
     } 
    }); 

现在的问题是:当 期待的 “成功” 的行为:它不经常使用。 但是,当我选择“完整”的行为:现在它总是失败,但没有价值?

控制器似乎发布值[count = 1],但json没有收到它!?

解决

[HttpPost] 
    public JsonResult search(int maxRows, string name_startsWith) 
    { 
     DataContext db = new DataContext(); 
     var result = new List<User>(); 
     result = (from p in db.Users where p.UserName.Contains(name_startsWith) || p.FirstName.Contains(name_startsWith) || p.LastName.Contains(name_startsWith) orderby p.LastName select p).Take(maxRows).ToList(); 
     var viewModel = result.Select(x => new 
     { 
      value = x.UserName, 
      label = x.FirstName + " " + x.LastName, 
      category = "People" 
     }); 
     return Json(viewModel, JsonRequestBehavior.AllowGet); 
    } 

我通过发送之前打包在一个视图模型的necesessary项目解决了这个问题。我认为模型中的一些不可比较的东西是与json导致这种冲突(500内部服务器错误)。 (解决方法发现在这个职位:https://stackoverflow.com/a/8027027/1062284谢谢Darin!)

+0

我也试图给硬编码的标签,值和类别名称,但它在这种情况下也不起作用。标签:“测试”, value:“2”, 类别:“人物”。但是当我尝试给出一个数组作为源;它工作没有任何问题。 – MrGorki 2012-01-10 11:10:55

+0

你可以删除'var result = new List ();'并将它替换为'List result';因为你正在创建一个新的实例。 – ivowiblo 2012-01-10 12:57:33

回答

0

尝试在Firefox中使用FireBug将断点放在完整的事件,并检查从控制器收到的数据。

只有当您获得HTTP 200结果而不是服务器返回错误时,成功行为才起作用。

如果您在Firebug中使用Javascript调试器和/或Net选项卡没有找到答案,那么可以将http调用的响应放到您的问题中,也许我可以看到问题。

+0

感谢您的回答。我尝试过,但无法达到,因为结果是一个空的对象。 Ayhow我找到了合适的解决方案atlast :)无论如何谢谢你 – MrGorki 2012-01-10 13:39:09