【问题标题】:Autocomplete results will not be displayed inside asp.net mvc partial view自动完成结果不会显示在 asp.net mvc 部分视图中
【发布时间】:2015-04-07 23:20:08
【问题描述】:

我的 _layout 视图中呈现了以下脚本:-

$(document).ready(function () {
    $("input[data-autocomplete-source]").each(function () {
        var target = $(this);
        target.autocomplete({
            source: target.attr("data-autocomplete-source"), 
            minLength: 1, 
            delay: 1000
        });   
    });  
});

我添加了以下字段以对其应用自动完成功能:-

<input  name="term" type="text" data-val="true" 
data-val-required= "Please enter a value."  
data-autocomplete-source= "@Url.Action("AutoComplete", "Staff")"  /> 

现在如果我将视图渲染为部分视图,那么脚本将不会触发,并且不会执行自动完成,所以我在 ajax-success 中添加了自动完成,如下所示:-

$(document).ready(function () {
    $(document).ajaxSuccess(function () {
        $("input[data-autocomplete-source]").each(function () {
            var target = $(this);
            target.autocomplete({
                source: target.attr("data-autocomplete-source"), 
                minLength: 1, 
                delay: 1000
            });
        });
    });
});

现在添加AjaxSuccess 后,将调用操作方法,当我检查 IE F12 开发人员工具上的响应时,我可以看到浏览器将收到 json 响应,但字段内不会显示任何内容(我的意思是自动完成结果不会显示在局部视图上)?

编辑

负责自动完成的动作方法是:-

public async Task<ActionResult> AutoComplete(string term)
      {


          var staff = await unitofwork.StaffRepository.GetAllActiveStaff(term).Select(a => new { label = a.SamAccUserName }).ToListAsync();
          return Json(staff, JsonRequestBehavior.AllowGet);


      }

EDIT2

这是负责显示模式弹出窗口的脚本:-

$(document).ready(function () {

    $(function () {
        $.ajaxSetup({ cache: false });
        //$("a[data-modal]").on("click", function (e) {
            $(document).on('click', 'a[data-modal]', function (e){
            $('#myModalContent').css({ "max-height": screen.height * .82, "overflow-y": "auto" }).load(this.href, function () {
                $('#myModal').modal({
                    //height: 1000,
                    //width: 1200,
                    //resizable: true,
                    keyboard: true
                }, 'show');
                $('#myModalContent').removeData("validator");
                $('#myModalContent').removeData("unobtrusiveValidation");
                $.validator.unobtrusive.parse('#myModalContent');
                bindForm(this);
            });
            return false;
        });


    });

    function bindForm(dialog) {
        $('form', dialog).submit(function () {
            $('.btn.btn-primary,.btn.btn-danger').prop("disabled", "disabled");
            $('#progress').show();
            if ($(this).valid()) {

                $.ajax({
                    url: this.action,
                    type: this.method,
                    data: $(this).serialize(),
                    success: function (result) {
                       if (result.ISsuccess) {
                            $('#myModal').modal('hide');
                            $('#progress').hide();
                            $('.btn.btn-primary,.btn.btn-danger').prop("disabled", false);
                            location.reload();
                            //  alert('www');
                        } else {

                            $('#progress').hide();
                            $('#myModalContent').html(result);
                            $('.btn.btn-primary,.btn.btn-danger').prop("disabled", false);
                            bindForm();
                        }
                    }
                });
            }
            else {
                $('.btn.btn-primary,.btn.btn-danger').prop("disabled", false);
                $('#progress').hide();
                return false;
            }

            return false;
        });
    }
});

【问题讨论】:

  • 你能展示你的AutoComplete控制器方法吗?
  • @teovankot 我添加了相关的操作方法
  • 我打赌我找到了你的问题,你可以看到答案更新
  • 在所有更新之后,您是否尝试将自动完成添加代码放入load 方法中?最好使用$.ajax 来获取数据,因为load 的工作方式有点不同,但是如果您使用load,请在加载completecallback 中添加您的自动完成代码,然后看看发生了什么。
  • 但确定我明白你的意思吗???我到底需要在哪里使用负载?

标签: asp.net-mvc asp.net-mvc-4 razor autocomplete asp.net-mvc-5


【解决方案1】:

首先,您不需要将ajaxSuccess 函数包装在ready 函数中。

第二,从服务器获取Json时最好使用POST

我试图解决您的问题,但没有运气。

在我的情况下它是如何工作的(IE 11,MVC 4

_Layout 上的脚本:

$(document).ajaxSuccess(function () {
    $("input[data-autocomplete-source]").each(function () {
        var target = $(this);
        target.autocomplete({
            source: function (request, response) {
                $.post(target.attr("data-autocomplete-source"), request, response);
            },
            minLength: 1,
            delay: 1000
        });
    });
});

控制器方法:

[HttpPost]
public JsonResult AutoComplete()
{
    return Json(new List<string>()
        {
            "1",
            "2",
            "3"
        });
}

部分视图 html:

<input name="term" type="text" data-val="true"
       data-val-required="Please enter a value."
       data-autocomplete-source="@Url.Action("AutoComplete", "Stuff")" />

更新:

我知道你的问题是什么。 Jquery 自动完成需要具有lablevalue 属性的对象数组。因此,如果您像这样更改控制器代码,它将起作用。

public async Task<ActionResult> AutoComplete(string term)
{
    var staff = await unitofwork.StaffRepository.GetAllActiveStaff(term)
    .Select(a => new { label = a.SamAccUserName, value = a.SamAccUserName })
    .ToListAsync();
    return Json(staff, JsonRequestBehavior.AllowGet);
}

您也可以使用$.map jquery 函数在客户端执行此操作,您可以查看示例here

【讨论】:

  • 感谢您的回复。现在正如我所提到的,如果我从 ajaxSuccess 中删除脚本,那么将永远不会在局部视图中调用负责自动完成的操作方法,而在 ajaxSuccess 中添加脚本将调用负责自动完成的操作方法,我将获取相关的 json,但结果不会显示在浏览器中。我在 IE10、frefox、chrome 上测试了这个
  • 要提一提的是,我正在使用 jQuery 在模态弹出窗口中加载部分视图,所以自动完成脚本可能无法理解新添加的 DOM ??
  • 你能展示如何创建 jquery 对话框并在其中加载 View 吗?因为我在 jQuery 对话框中使用 PartialView 测试了您的示例,并且自动完成没有问题。
  • 我将值添加到返回的 json 中,但这并没有解决问题,而且我认为这不会在所有方面造成任何问题,因为如果我渲染视图,自动完成将运行良好作为非局部视图。现在将部分视图显示为模式弹出窗口的脚本是:-
  • bindForm 函数有什么作用?
猜你喜欢
  • 2021-02-07
  • 1970-01-01
  • 1970-01-01
  • 2016-02-06
  • 1970-01-01
  • 2013-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多