2010-04-01 84 views
0

我从我的控制器返回JSON到我的视图,以填充MVC中的jQuery自动完成文本框。问题是,我的一些数据包含逗号,因此被自动完成助手分割。如何在返回json时忽略逗号mvc

继承人我的代码。

控制器:

public ActionResult GetData() 
    { 
     var data = repository.GetData(); 

     return Json(data); 
    } 

视图(脚本):

$.post("../MyController/GetData", 

     function(data) { 
     var evalData = eval(data) + ""; //formats the text 

     $("#Data").autocomplete(evalData.split(","), 
     { 
      max: 500, 
      matchContains: true 
     }); 
    }); 

正如你所看到的,我使用jQuery .split帮手分裂返回的JSON。我应该使用正则表达式还是应该采用完全不同的方法?

+1

如果evalData看起来像“喇嘛喇嘛”,“唧唧歪歪” ......您可以通过拆分“‘’”而不是“” – vittore 2010-04-01 18:55:00

+0

使用CSV解析器。 – 2010-04-01 20:18:58

+0

您使用GetData返回多少物品?由于它不接受任何参数,它会发送所有的数据,jquery留下来进行过滤。 – AdmSteck 2010-04-01 23:59:06

回答

1

我假设您使用内建于jQuery UI 1.8内的Autocomplete。如果你是,你有几个不同的选择。

  1. 系基于文件的可用的样本之一,你可以给它一个字符串,指定你的服务的URL,而不必担心自己的解析回报。因此,沿着线的东西:

    $("#Data").autocomplete({ 
        source: "../MyController/GetData" 
    }); 
    

    你的行动将很可能需要获得响应的请求以及后期虽然和您的数据可能需要在[{ label: "something", value: "1" }, ... ] 的形式,你可以通过塑造做你的数据在发送之前使用Linq查询。

    var data = from d in repository.GetData() 
          select new 
          { 
           label = d.[whatever you want the label to be] 
           value = d.[whatever you want the value to be] 
          }; 
    return Json(data); 
    
  2. 你可以用上面的例子中的部分当前的实施结合起来,让这样的事情:

    $.post("../MyController/GetData", 
        function(data) { 
         $("#Data").autocomplete({ 
          source: JSON.parse(data), 
          max: 500, 
          matchContains: true 
         }); 
        }); 
    

    这是假设数据处于[{ label: "something", value: "1" }, ... ]形式(见1如何使用Linq来塑造它)。 JSON解析器将为您处理引号问题中的逗号。

  3. 当您想要检索数据时,您还可以指定method to call

    $("#Data").autocomplete({ 
        source: function(request, response) { 
         $.ajax({ 
          url: "../MyController/GetData", 
          dataType: "json", 
          success: function(data) { 
           response(data); 
          } 
         }) 
        } 
    }); 
    

    (见上文关于如何塑造使用LINQ数据)

一对夫妇的有关当前执行的意见。

  • 你应该考虑使用UrlHelper而不是硬codeing的URL的情况下,你改变路线。

  • 而不是eval您应该使用JSON2.jslibrary解析您的操作的返回值。它通常稍微多一点secure,并在支持native JSON parsing的较新浏览器中产生更好的性能。

+0

谢谢一堆罗马军团。我没有得到'source:JSON.parse(data)'参数的工作。相反,我用它替换了eval.split(','),它效果很好。 – Darcy 2010-04-05 13:58:59

+0

@Darcy:要让JSON.parse工作,你需要在你的页面上包含JSON2.js文件。这就是解析方法的来源。另外,一旦你调用** eval **,你不再需要调用split,你的动作中的数据将返回为JSON数组,因此将它作为参数传递给** eval **将会返回一个数组拆分应该是无操作或导致错误)。 – R0MANARMY 2010-04-05 14:43:29

0

好吧,经过很多来回和几个编辑这里是我的最终答案。 :)

$.post("../MyController/GetData", function(data) { 
     $("#Data").autocomplete({ 
      source: data 
     }) 
    }); 

另外,我相信拆分功能是纯javascript和不jQuery。