【问题标题】:Autocomplete: display results with json data自动完成:使用 json 数据显示结果
【发布时间】:2014-02-27 14:37:50
【问题描述】:

我正在尝试构建一个自动完成功能,但我在修补各个部分时遇到了麻烦。

首先,我的观点包括这个字段:

<p>@Html.TextBoxFor(_item => _item.mCardName, Model.mCardName, new { @class = "cardText", id = "card_name"} )  </p>

非常简单。接下来,javascript调用:

<script type="text/javascript">
    $(function() {
        $('#card_name').autocomplete({
            minlength: 5,
            source: "@Url.Action("ListNames", "Card")",
            select: function (event, ui) {
                $('#card_name').text(ui.item.value);
            },
        });
    });
</script>

调用此方法:

public ActionResult ListNames(string _term)
{
    using (BlueBerry_MTGEntities db = new BlueBerry_MTGEntities())
    {
        db.Database.Connection.Open();

        var results = (from c in db.CARD
                   where c.CARD_NAME.ToLower().StartsWith(_term.ToLower())
                   select new {c.CARD_NAME}).Distinct().ToList();

        JsonResult result = Json(results.ToList(), JsonRequestBehavior.AllowGet);

        return Json(result, JsonRequestBehavior.AllowGet);
    }
}

如果我插入“Power”字样,JSON 数据会像这样发回:

{"ContentEncoding":null,"ContentType":null,"Data":[{"CARD_NAME":"Power Armor"},{"CARD_NAME":"Power Armor (Foil)"},{"CARD_NAME":"Power Artifact"},{"CARD_NAME":"Power Conduit"},{"CARD_NAME":"Power Conduit (Foil)"},{"CARD_NAME":"Power Leak"},{"CARD_NAME":"Power Matrix"},{"CARD_NAME":"Power Matrix (Foil)"},{"CARD_NAME":"Power of Fire"},{"CARD_NAME":"Power of Fire (Foil)"},{"CARD_NAME":"Power Sink"},{"CARD_NAME":"Power Sink (Foil)"},{"CARD_NAME":"Power Surge"},{"CARD_NAME":"Power Taint"},{"CARD_NAME":"Powerleech"},{"CARD_NAME":"Powerstone Minefield"},{"CARD_NAME":"Powerstone Minefield (Foil)"}],"JsonRequestBehavior":0,"MaxJsonLength":null,"RecursionLimit":null}

为了参考,这里有两个运行的脚本:

<script src="/Scripts/jquery-2.0.3.js"></script>
<script src="//code.jquery.com/ui/1.10.4/jquery-ui.js"></script>

但是什么都没有显示。我希望看到像普通自动完成一样显示的结果。谁能帮我解决问题?

编辑

我已经为此工作了一段时间。我已经在那里发布了新的 javascript、控制器方法和获得的结果。但这件事仍然无法正常工作,我将不胜感激。

【问题讨论】:

    标签: c# javascript jquery asp.net-mvc autocomplete


    【解决方案1】:

    对于自动完成,我使用 javascriptserializer 类。代码是这样的。

    My.Response.ContentType = "application/json"
    Dim serializer As JavaScriptSerializer = New JavaScriptSerializer
    Dim dt As DataTable = GetDataTable("proc_name", My.Request.QueryString("term"))
    Dim orgArray As ArrayList = New ArrayList
    For Each row As DataRow In dt.Rows
        Dim thisorg As New thisOrg
            thisorg.id = row("organization_child_id")
            thisorg.value = row("organization_name")
            orgArray.Add(thisorg)
    Next
    My.Response.Write(serializer.Serialize(orgArray))
    
    Public Class thisOrg
        Public id As Integer
        Public value As String
    End Class
    

    基本上只需要一个数据表,将一系列对象添加到数组中,然后将其序列化。

    【讨论】:

    • 呃,那是什么语言?
    • 它是vb.net,可以很容易地移植到c#。
    【解决方案2】:

    终于!休息了一会儿,我得到了答案。

    看到了吗?

    public ActionResult ListNames(string _term)
    {
        using (BlueBerry_MTGEntities db = new BlueBerry_MTGEntities())
        {
            db.Database.Connection.Open();
    
            var results = (from c in db.CARD
                       where c.CARD_NAME.ToLower().StartsWith(_term.ToLower())
                       select new {c.CARD_NAME}).Distinct().ToList();
    
            JsonResult result = Json(results.ToList(), JsonRequestBehavior.AllowGet);
    
            return Json(result, JsonRequestBehavior.AllowGet);
        }
    }
    

    碰巧,我正在构建另一个 Json 对象的 Json 对象。所以这就是数据没有正确传递的原因。

    我已经重建了这个方法,让它工作,并像这样改进它:

    public JsonResult ListCardNames(string term)
    {
        using (BlueBerry_MagicEntities db = new BlueBerry_MagicEntities())
        {
            db.Database.Connection.Open();
    
            var results = from cards in db.V_ITEM_LISTING
                          where cards.CARD_NAME.ToLower().StartsWith(term.ToLower())
                          select cards.CARD_NAME + " - " + cards.CARD_SET_NAME;
    
            JsonResult result = Json(results.ToList(), JsonRequestBehavior.AllowGet);
    
            return result;
        }
    

    还有我的 javascript 操作:

    <script type="text/javascript">
        $(function() {
            $('#searchBox').autocomplete({
                source: function(request, response) {
                    $.ajax({
                        url: "@Url.Action("ListCardNames")",
                        type: "GET",
                        dataType: "json",
                        data: { term: request.term },
                        success: function(data) {
                            response($.map(data, function(item) {
                                return { label: item, value1: item };
                            }));
                        }
                    });
                },
                select:
                    function(event, ui) {
                        $('#searchBox').val(ui.item);
                        $('#cardNameValue').val(ui.item);
                        return false;
                    },
                minLength: 4
            });
        });
    </script>
    

    现在一切都像魅力一样运作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-19
      • 2013-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多