【问题标题】:Typeahead.js for MVC 5 ModelsMVC 5 模型的 Typeahead.js
【发布时间】:2017-04-24 08:05:55
【问题描述】:

我刚刚使用 thw Typeahead.js 为 MVC 5 模型包装器实现了 typeahead 功能

http://timdwilson.github.io/typeahead-mvc-model/

一切正常,但我不知道如何设置建议下拉菜单中显示的项目数量限制。 javascript是这样的

$('#scrollable-dropdown-menu .typeahead').typeahead(null, {
  name: 'countries',
  limit: 10, -----> limit set here
  source: countries
});

但我看不到 mvc 模型包装器是如何实现这一点的,有三个重载,其中一个有“AdditionalViewdata”,也许这是需要的?没有我能找到的文档,而且似乎没有其他人这样做(看起来它在下拉列表中默认为 5)我的后端机制返回超过 5 个结果,它只是没有反映在 html 中

@Html.AutocompleteFor(model => model.Organisation.Org, model => model.Organisation.ORGID, "Autocomplete", "Organisation", false, new { htmlAttributes = new { @class = "form-control" } })

谁能帮忙?

【问题讨论】:

  • 对不起,但我不明白你想说什么,我确实提到我的后端代码工作得很好,它返回了一堆以我输入的字符开头的数据项(在已输入第 2 个)。例如,我的后端代码返回 22 个结果,但在 HTML 中只生成了 5 个。所以我假设在某个地方设置了一个“默认”限制为 5。我的问题是,我如何使用 typeahed mvc helper 更改该限制?我看不到任何明显的机制
  • 好的。我运行下面的代码并添加了 16 个返回值,当我输入自动完成时,返回了 16 个值。因此,如果您要撤回 22 条记录 - 符合条件 - 则会显示 22 条自动完成。
  • 这很奇怪,因为我只得到 5 个,我检查了控制器中返回的数据,我得到了 22 个数据项
  • 你为什么不从头开始,按照我的例子来看看它是否有效?
  • 我的服务器端代码与您的基本相同,它返回的数据但该数据并未反映在包装器生成的 html 中。我会敲出与你相同的东西并试一试,但我看不出它有什么不同,对我来说,它看起来像是客户端代码中设置的限制。应该可以覆盖限制集,但我不知道如何在 mvc 部分中

标签: c# asp.net-mvc typeahead.js


【解决方案1】:

关键是使用linq“Take”

这可行:1) 在您的控制器中创建一个操作并设置 RouteConfig 以启动此操作

public class HomeController : Controller
{
    public ActionResult Index20()
    {
        MyViewModel m = new MyViewModel();
        return View(m);
    }

创建一个没有任何类型母版页的视图 添加此视图模型:

public class MyViewModel
{
    public string SourceCaseNumber { get; set; }
}

转到管理 Nuget 包或 PM 控制台并添加到 MVC 5 项目 - Typeahead.js for MVC 5 Models by Tim Wilson 将添加的 HtmlHelpers.cs 的命名空间更改为 System.Web.Mvc.Html 并重建 添加这个类:

public class CasesNorm
{
    public string SCN { get; set; }
}

将这些方法添加到您的控制器中:

private List<Autocomplete> _AutocompleteSourceCaseNumber(string query)
    {
        List<Autocomplete> sourceCaseNumbers = new List<Autocomplete>();
        try
        {
            //You will goto your Database for CasesNorm, but if will doit shorthand here

            //var results = db.CasesNorms.Where(p => p.SourceCaseNumber.Contains(query)).
            //    GroupBy(item => new { SCN = item.SourceCaseNumber }).
            //    Select(group => new { SCN = group.Key.SCN }).
            //    OrderBy(item => item.SCN).
            //    Take(10).ToList();   //take 10 is important

            CasesNorm c1 = new CasesNorm { SCN = "11111111"};
            CasesNorm c2 = new CasesNorm { SCN = "22222222"};
            IList<CasesNorm> aList = new List<CasesNorm>();
            aList.Add(c1);
            aList.Add(c2);
            var results = aList;

            foreach (var r in results)
            {
                // create objects
                Autocomplete sourceCaseNumber = new Autocomplete();

                sourceCaseNumber.Name = string.Format("{0}", r.SCN);
                sourceCaseNumber.Id = Int32.Parse(r.SCN);
                sourceCaseNumbers.Add(sourceCaseNumber);
            }
        }
        catch (EntityCommandExecutionException eceex)
        {
            if (eceex.InnerException != null)
            {
                throw eceex.InnerException;
            }
            throw;
        }
        catch
        {
            throw;
        }
        return sourceCaseNumbers;
    }

    public ActionResult AutocompleteSourceCaseNumber(string query)
    {
        return Json(_AutocompleteSourceCaseNumber(query), JsonRequestBehavior.AllowGet);
    }

     throw;
    }
    catch
    {
        throw;
    }
    return sourceCaseNumbers;
}

public ActionResult AutocompleteSourceCaseNumber(string query)
{
    return Json(_AutocompleteSourceCaseNumber(query), JsonRequestBehavior.AllowGet);
}

感谢http://timdwilson.github.io/typeahead-mvc-model/

【讨论】:

  • 还有其他人对这个问题有什么建议吗?我的服务器端代码运行良好,例如,我在控制台中输入“fr”,我得到三个结果,但只有 2 个出现在客户端列表中。我面临着寻找一种全新的方式来实现自动完成的前景,因为这根本行不通
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-15
  • 2015-11-01
  • 1970-01-01
相关资源
最近更新 更多