简体   繁体   English

使用MVC 4 / Razor自动完成

[英]Autocomplete with MVC 4 / Razor

I think I am missing something obvious while attempting to add autocomplete functionality in MVC 4. From what I have found in other posts I have been able to put together an example however the method in my controller is not being called. 我想在尝试在MVC 4中添加自动完成功能时,我遗漏了一些明显的东西。从我在其他帖子中找到的内容,我已经能够将一个示例放在一起但是我的控制器中的方法没有被调用。

What I have tried so far... 到目前为止我尝试过的...

_Layout _布局

@Styles.Render("~/Content/themes/base/css")
@Scripts.Render("~/bundles/jquery")
@Scripts.Render("~/bundles/jqueryui")
@Scripts.Render("~/bundles/jqueryval")

Controller 调节器

Public Function Numbers(term As String) As ActionResult
    Return Json(New String() {"one", "two", "three", "four", "five", "six"}, JsonRequestBehavior.AllowGet)
End Function

View (I have hard coded the Home/Numbers for now) 查看(我现在硬编码了Home / Numbers)

<div class="editor-label">
    @Html.LabelFor(Function(model) model.Number)
</div>
<div class="editor-field">
    @Html.EditorFor(Function(model) model.Number)
    @Html.ValidationMessageFor(Function(model) model.Number)
</div>

<script type="text/javascript">
    $(function () {
        $("#Number").autocomplete({
            source: 'Home/Numbers',
            minLength: 1
        });
    });
</script>

When I run my app and type in the textbox nothing happens. 当我运行我的应用程序并输入文本框时,没有任何反应。 I have put a breakpoint in the "Numbers" function and it seems that it is never called. 我在“Numbers”函数中放了一个断点,它似乎永远不会被调用。

My project can be found here http://www.filedropper.com/testapp 我的项目可以在http://www.filedropper.com/testapp找到

If you have the @Scripts.Render lines at the bottom of the body element in the layout and after the @RenderBody() you need to put your script in the scripts section: 如果在布局中的body元素底部和@RenderBody()之后有@Scripts.Render行,则需要将脚本放在scripts部分:

@section scripts
<script type="text/javascript">
    $(function () {
        $("#Number").autocomplete({
            source: '@Url.Action("Numbers","Home")',
            minLength: 1
        });
    });
</script>
End Section

Because your script depends on jQuery so jQuery should be loaded first. 因为你的脚本依赖于jQuery所以应该首先加载jQuery。

Or just move your @Scripts.Render declaration into the head in the layout then you don't need to put your code into the scripts section (but you are better off with using the section) 或者只是将您的@Scripts.Render声明移动到布局的head ,然后您不需要将代码放入scripts部分(但最好使用该部分)

I suggest you to control errors in Chrome to ensure that jQuery libraries working properly. 我建议你控制Chrome中的错误,以确保jQuery库正常工作。 if there is no problem, Try this script : 如果没有问题,请尝试以下脚本:

$(document).ready(function () { 
    $("#Number").each(function () {
        $(this).autocomplete({ source: $(this).attr("data-autocomplete") });
    });
});

Then in your Razor (C#): 然后在你的剃刀(C#)中:

<input type="text" id="Number" data-autocomplete="@Url.Action("Action","Controller")" autocomplete="on" />

If you want to use Razor Html Helpers instead of using 'input' tag, The id attribute is the same name of Model.Member. 如果要使用Razor Html Helpers而不是使用'input'标记,则id属性与Model.Member的名称相同。 Notice that in Controller, you must input string with the 'term' name, as written in your code. 请注意,在Controller中,您必须输入带有'term'名称的字符串,如代码中所写。 For security reasons, you must avoid using parameters in js file that shows the site technology. 出于安全原因,您必须避免在显示站点技术的js文件中使用参数。 The method declared above never uses js file to get address of resource. 上面声明的方法从不使用js文件来获取资源的地址。

For Viewpage 对于Viewpage

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.9.1/jquery-ui.min.js"></script>

<input type="text" id="txtmasterserach" name="txtmasterserach" placeholder="City, region, district or specific hotel"  autocomplete="off"/> 
 <input type="hidden" name="hidenkeyvalues" id="MovieID" /> 

<script type="text/javascript">
    $(document).ready(function () {
        $("#txtmasterserach").autocomplete({
            source: function (request, response) {
                $.ajax({
                    url: "/Company/getautobox",
                    type: "POST",
                    dataType: "json",
                    data: { Prefix: request.term },
                    success: function (data) {
                        response($.map(data, function (item) {
                            return { value: item.Id, label: item.name };
                        }))
                    }
                })
            },
            select: function (event, ui) {
                $("#MovieID").val(ui.item.value);
                $("#txtmasterserach").val(ui.item.label);
                event.preventDefault();
                return false;
            },
            focus: function (event, ui) {
                $("#MovieID").val(ui.item.value);
               // $("#txtmasterserach").val(ui.item.label);
                event.preventDefault();
                return false;
            },
            messages: {
                noResults: "", results: ""
            }
        });
    });
    </script>

For Controller : 对于控制器:

public class companyController : Controller
{
public JsonResult getautobox(String Prefix)
    {
        SqlConnection con = new SqlConnection();
        con.ConnectionString = ConfigurationManager.ConnectionStrings["Connection"].ConnectionString;
        SqlCommand cmd = new SqlCommand("procedurename", con);
        cmd.Parameters.AddWithValue("@prefix", Prefix);
        cmd.CommandType = CommandType.StoredProcedure;
        DataSet ds = new DataSet();
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        da.Fill(ds);
        List<autosearchdatalist> auto = new List<autosearchdatalist>();
        if (ds.Tables[0].Rows.Count > 0)
        {
            for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
            {
                auto.Add(new autosearchdatalist
                {
                    Id = ds.Tables[0].Rows[i]["Id"].ToString(),
                    name = ds.Tables[0].Rows[i]["hotelname"].ToString()
                });
            }
        }
        if (ds.Tables[1].Rows.Count > 0)
        {
            for (int i = 0; i < ds.Tables[1].Rows.Count; i++)
            {
                auto.Add(new autosearchdatalist { 
                    Id = ds.Tables[1].Rows[i]["Id"].ToString(),
                    name = ds.Tables[1].Rows[i]["hotelname"].ToString() 
                });
            }
        }
        if (ds.Tables[2].Rows.Count > 0)
        {
            for (int i = 0; i < ds.Tables[2].Rows.Count; i++)
            {
                auto.Add(new autosearchdatalist
                {
                    Id = ds.Tables[2].Rows[i]["Id"].ToString(),
                    name = ds.Tables[2].Rows[i]["hotelname"].ToString()
                });
            }
        }
        String msg = "";
        return Json(auto);
    }
}

Keep router setting default otherwise action will not call 保持路由器设置默认,否则操作不会调用

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "company", action = "Index", id = UrlParameter.Optional }
        );
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM