1

我是 MVC 新手,正在设计一个简单的零件搜索工具。我希望 URL 使用控制器/操作/id 格式的搜索词进行更新,例如:

http://localhost/Materials/Search/PartA

但是,它会像这样更新:

http://localhost/Materials/Search?id=PartA

当我输入所需的 URL 时,它可以工作。但是,从同一窗口搜索新零件会导致问题:

http://localhost/Materials/Search/PartA?id=PartB

我究竟做错了什么?我考虑过使用 javascript 进行重定向,但随后我还必须检查 URL 字符串以查看 ID 是否已嵌入在 URL 中。我相信其他人已经处理过这个问题,所以只是想知道最好的做法是什么。

控制器:

Namespace MyApp.Controllers
  Public Class MaterialsController
    Inherits System.Web.Mvc.Controller

    '
    ' GET: /Materials

    Function Index() As ActionResult
        Return View()

    End Function

    Function Search(Optional ByVal id As String = "") As ActionResult
        If String.IsNullOrWhiteSpace(id) Then
            id = "Enter a part number to search."
        Else
            id = "Part search for " + id + "."
        End If
        Return View("~/Views/Materials/Search.vbhtml", Nothing, id)
    End Function

 End Class
End Namespace

看法:

    @ModelType string

    @Code
        ViewData("Title") = "Search"
    End Code

    <h2>Search</h2>


    @Code
        Using (Html.BeginForm("Search", "Materials", FormMethod.Get))
        @<p>@Html.TextBox("id", Nothing, New With {.maxlength = 20, .style = "width:200px"})
           <input type="submit" value="Search" />
        </p>
        End Using
    End Code

    <h3>@Model</h3>
4

3 回答 3

1

如果您希望文本框中的 id 在 URL 中,则需要使用 URL 中的 id 发出请求,而不是在表单中发布值。您将需要使用一些 javascript 来构造 URL 并从文本框中获取值。我更喜欢使用 jQuery。您可以摆脱表单并将提交按钮更改为常规按钮并执行以下操作:

HTML

@Html.TextBox("id", Nothing, New With {.maxlength = 20, .style = "width:200px"})
<input type="button" id="search" value="Search" />

Javascript

// this is jQuery's short hand and analogue to document.ready
$(function () {

    // attach a click handler to the Search button
    $('#search').click(function () {

        // make a request to /Materials/Search with the id of the text box
        $(location).attr('href', '/Materials/Search/' + $('#id').val());

    }):

});
于 2013-08-19T12:38:06.390 回答
0

实施 asymptoticFault 的建议后,这是我修改后的视图。我更改了添加 javascript 事件的方法以兼容早于 IE9 的版本。我还删除了表单标签,并添加了一个javascript方法来在按下回车键时调用重定向函数。

    @ModelType string

    @Code
       ViewData("Title") = "Search"
    End Code

    <h2>Search</h2>


    <p>
        <input id="searchString" type="text" onkeypress="checkForEnter()" style ="width:200px" maxlength="20">
        <input type="button" id="search" value="Search" onclick="searchPart()" />
    </p>

    <h3>@Model</h3>


<script type="text/javascript">
   function searchPart() {

        // make a request to /Materials/Search with the id of the text box
       $(location).attr('href', '/Materials/Search/' + $('#searchString').val());
   };

   function checkForEnter() {
       $("#searchString").keyup(function (event) {
           if (event.keyCode == 13) {
               $("#search").click();
           }
       });
   };

</script>
于 2013-08-19T13:31:46.970 回答
0

检查路由映射类(RouteConfig),整理出url结构。

如果您不知道查询字符串是什么,这就是说在表单上使用 GET 操作有很多缺点:http: //www.w3schools.com/tags/att_form_method.asp

尝试将表单操作更改为 POST,然后从 Search 方法执行 RedirectToAction 到 Result ActionMethod(这次接受 GET),将您从帖子中获得的值作为 GET 参数传递。通过这种方式,您可以在 POST 中使用 ViewModel,FORM 将是安全的,并且通常您可以更好地控制 url。

于 2013-08-19T12:35:57.713 回答