在ASP.NET MVC中实现简单搜索功能

时间:2016-11-08 03:59:06

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

我正在尝试在我正在开发的网络应用中实施基本搜索页面。现在页面看起来像这样

enter image description here

当用户输入姓氏时,控制器会被调用以在后端Microsoft SQL Server数据库中搜索具有该姓氏的所有帐户

现在,HTML表单看起来像这样

@using (Html.BeginForm("SearchAct", "HomeController", FormMethod.Post))
{
    <form>
        <div>
            Last Name:<br>
            <input type="text" id="nameToFind">

            <input type="button" id="submitId" value="submit" />

        </div>
    </form>
}

它应该调用此控制器

[HttpPost]
public void SearchAct()
{
    Console.WriteLine();
}

最终将执行搜索,然后将结果放在页面上。但是,我无法调用控制器。我在WriteLine上设置了一个断点,所以我知道它永远不会到达那里而且我不知道我做错了什么

4 个答案:

答案 0 :(得分:3)

在文本框中添加名称属性。仅基于名称属性构建表单集合。

更改按钮类型以提交,然后它会将您的表单发布到控制器。

@using (Html.BeginForm("SearchAct", "Home", FormMethod.Post))
{

    <div>
        Last Name:<br>
        <input type="text" id="nameToFind" name="nameToFind">

        <input type="submit" id="submitId" value="submit" />

    </div>

}

@{
    if(ViewBag.SearchKey != null)
    {
        <span>
            Search Key: @ViewBag.SearchKey
        </span>
    }
}

而是Console.WriteLine()使用ViewBag将您所需的数据发送回视图 请参阅以下行动

//Get Action for rendering view
public ActionResult SearchAct()
{
    return View();
}


[HttpPost]
public ActionResult SearchAct(string nameToFind)
{
    ViewBag.SearchKey = nameToFind;

    return View();
}

操作参数名称和文本框名称属性值必须相同,否则将null

如果您的表单包含多个文本框,请从FromCollectionRequest

中读取所有输入值
[HttpPost]
public ActionResult SearchAct(FormCollection form)
{
    ViewBag.SearchKey = form["nameToFind"];

    return View();
}

答案 1 :(得分:2)

首先:使用razor语法创建表单:

@using (Html.BeginForm("SearchAct", "HomeController", FormMethod.Post))
{

}

这将生成如下形式:

<form method="post" action="/HomeController/SearchAct">

</form>

因此,无需在其中创建嵌套表单。

@using (Html.BeginForm("SearchAct", "HomeController", FormMethod.Post))
{
    <form> // <- here
        <div>
            Last Name:<br>
            <input type="text" id="nameToFind">

            <input type="button" id="submitId" value="submit" />

        </div>
    </form> // <- here
}

第二:HomeController会匹配控制器的全名HomeControllerController

因此,如果您想点击Home控制器,请从Controller

中的HomeController移除@using (Html.BeginForm("SearchAct", "HomeController", FormMethod.Post)) {}

Thirth:如果你想抓住nameToFind,你可以尝试:

[HttpPost]
public void SearchAct(string nameToFind)
{
    Console.WriteLine();
}

希望这有帮助!

答案 2 :(得分:1)

更正您的表单HomeController应该只是Home

@using (Html.BeginForm("SearchAct", "Home", FormMethod.Post))
{
    <form>
        <div>
            Last Name:<br>
            <input type="text" id="nameToFind">

            <input type="button" id="submitId" value="submit" />

        </div>
    </form>
}

控制器应该接受过滤器的输入参数

[HttpPost]
public void SearchAct(string nameToFind)
{
    // filter snomething
    Console.WriteLine(nameToFind);
}

答案 3 :(得分:1)

首先,我们不需要两个表单标记,您不需要添加控制器后缀。记得:

    @using (Html.BeginForm("SearchAct", "Home", FormMethod.Post))
 {
    <div>
        Last Name:<br>
        <input type="text" id="nameToFind" name="nameToFind">

        <input type="button" id="submitId" value="submit" />

    </div>
 }

其次,如果您需要搜索,则需要添加与输入类型文本名称相同的参数:

    [HttpPost]
    public void SearchAct(string nameToFind)
    {
     Console.WriteLine();
    }