zoukankan      html  css  js  c++  java
  • Asp.Net MVC4.0 官方教程 入门指南之七增加搜索方法和视图

    译者注:本节内容实际上是原英文教程第六节的后半部分,因感觉第六节内容较长,本部分内容与上节标题(添加Edit方法和视图)无关,在项目开发中搜索功能既常见又常用,在此拿出来作为单独章节。

    本节课程中,你将添加一个SearchIndex 方法,使你可以通过片名来搜索影片。 /Movies/SearchIndex地址将可用。该请求将显示一个包含用户可以输入的input元素的表单来查找影片。当用户提交表单后,该方法将得到用户提交的搜索值并用于搜索数据库。

    首先在现有的MoviesController类中增加一个SearchIndex方法。该方法将返回包含Html表单的视图。以下为代码:

            public ActionResult SearchIndex(string searchValue)
            {
                //linq方式,查询所有影片,仅定义,不执行
                var movies = from m in db.Movies 
                             select m;
                if (string.IsNullOrEmpty(searchValue) == false)
                {
                    //基于linq查询结果的Lambda表达式,调用where方法后执行linq
                    movies = movies.Where(m => m.Name.Contains(searchValue));                
                }
                return View(movies);
            }

    查询操作是延迟执行的,意味着表达式的值运算直到值被遍历或者调用ToList方法才会被执行。在这个例子中,查询是在SearchIndex视图中执行的。想了解更多关于查询延迟执行方面的信息,请参见Query Execution

    现在你可以实现 SearchIndex视图,由它来呈现用户表单。在SearchIndex方法内部右键单击,选择添加视图。在对话框中,勾选“创建强类型视图”,然后指定你将传递Movie对象给视图模板作为它的模型类。在支架模板列表中,选择List后点击添加,如下图所示

    点击添加按钮后,视图模板Views\Movies\SearchIndex.cshtml将被创建。因为你选择了支架模板中的List,Visual Studio在视图中自动生成一些默认标记。支架系统查看Movie类并为其每个属性创建了<Label>属性元素,形成HTML表单。以下为视图文件:

    View Code
    @model IEnumerable<MvcMovie.Models.Movie>
    
    @{
        ViewBag.Title = "SearchIndex";
    }
    
    <h2>SearchIndex</h2>
    
    <p>
        @Html.ActionLink("Create New", "Create")   
    </p>
    <table>
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.Name)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Genra)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Price)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Date)
            </th>
            <th></th>
        </tr>
    
    @foreach (var item in Model) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.Name)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Genra)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Price)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Date)
            </td>
            <td>
                @Html.ActionLink("Edit", "Edit", new { id=item.ID }) |
                @Html.ActionLink("Details", "Details", new { id=item.ID }) |
                @Html.ActionLink("Delete", "Delete", new { id=item.ID })
            </td>
        </tr>
    }
    </table>

    运行程序,导航到/Movies/SearchIndex.,在地址后附加一个类似“?searchValue=少年”的查询字符串,会将过滤后的结果显示出来。

    如果你改变SearchIndex 方法的签名,使参数标识符为ID,则参数ID将与在Global.asax文件中设置的默认路由匹配{controller}/{action}/{id},即把SearchIndex的形参 searchValue修改为ID。现在你可以传递搜索名称作为路由数据替代查询字符串方式,即采用以下方式访问http://localhost:5279/Movies/SearchIndex/少年。

    然而,你不能期望用户为了搜索影片而每次去修改url。因此,添加交互界面(UI)来帮助他们过滤影片。如果你上文中对SearchIndex的方法签名进行了修改,用来测试通过路由绑定方式来传递ID参数,那么改回来,即方法拥有一个名称为searchValue的字符串类型参数。

    打开Views\Movies\SearchIndex.cshtml文件,在@Html.ActionLink("Create New", "Create")代码后添加如下代码

    @using (Html.BeginForm()){ 
    <p> 片名: @Html.TextBox("searchValue")<br /> 
    <input type="submit" value="查询" /></p> 
    }

    Html.BeginForm方法将创建<form>标记。用户通过点击“查询”按钮提交表单。运行程序并尝试查询影片。

    实际并没有标记为HttpPost属性的SearchIndex的方法。因为该方法并没有修改应用的状态,仅仅是过滤数据,因此不需要HttpPost属性的重载方法。

    译者注:此处有个问题想不通。按上文所述,默认的SearchIndex方法属性是HttpGet,在视图中使用Html.BeginForm(),运行程序后,查看页面源代码,发现默认是<form action="/Movies/SearchIndex" method="post">,也即用户点击按钮后,是通过post方式把表单传递过来的,为啥会调用上面接受HttpGet方式的SearchIndex方法?难道是优先找HttpPost属性,找不到的情况下提交给HttpGet处理?这是Http协议机制还是MVC机制处理的结果?

    你可以添加下面的HttpPost属性的SearchIndex 方法。在这种情况下,方法调用将匹配HttpPost方式,下面的方法将被执行。

            [HttpPost]
            public string SearchIndex(FormCollection frm, string searchValue)
            {
                return "<h3> 表单HttpPost方式搜索 : " + searchValue + "</h3>"; 
            }

    但是,即使你添加了SearchIndex的HttpPost版本的方法,使用的时候仍然存在限制。试想一下,你要得到一个特定的搜索书签,或者你想发送一个链接给朋友,他们可以通过点击看到与你相同的过滤后的电影列表。注意post请求的url和get请求的url完全相同,在地址栏没有搜索信息。搜索的文本信息作为表单域值送到服务器。因此你不能获取包含搜索信息的书签或者发给朋友一个链接。

    解决方式就是使用BeginForm的重载方法,指明post请求添加搜索信息到url地址,并路由到HttpGet版本的SearchIndex 方法。使用以下代码替换已存在的BeginForm 方法
    @using (Html.BeginForm("SearchIndex","Movies",FormMethod.Get))

    现在当你提交搜索时,url将包含查询字符串。即使存在HttpPost属性的SearchIndex方法,搜索工作也将由HttpGet属性的SearchIndex方法处理。


    译者注:以上为原文翻译的结果。译者感觉存在逻辑矛盾的地方。使用Html.BeginForm的重载方法,指定了FormMethod.Get参数,也即是将表单的提交方式由默认的post方式变更为Get,自然就会去调用HttpGet属性的SearchIndex方法。

    译者注:原文进一步举了一个使用影片风格下拉列表作为查询条件的例子,与上大都相同,仅细节稍微有所差异,做删节处理,感兴趣的可查看原文。

    在本节中,你创建了搜索方法和视图,让用户可以通过影片名称搜索数据库。在下节中,你将学习如何给Movie模型添加一个属性,以及如何添加一个初始化器,用来自动创建测试数据库。


    本教程所有文章导航

    本系列共10篇文章,翻译自Asp.Net MVC4 官方教程,由于本系列文章言简意赅,篇幅适中,从一个示例开始讲解,全文最终完成了一个管理影片的小系统,非常适合新手入门Asp.Net MVC4,并由此开始开发工作。

    原文供9篇文章,译者将其中第6篇拆成了2篇

    1. Asp.Net MVC4 入门介绍

    · 原文地址:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/intro-to-aspnet-mvc-4

    · 译文地址:http://www.cnblogs.com/seawaving/archive/2012/12/03/2800210.html

    2. 添加一个控制器

    · 原文地址:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-a-controller

    · 译文地址:http://www.cnblogs.com/seawaving/archive/2012/12/04/2801949.html

    3. 添加一个视图

    · 原文地址:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-a-view

    · 译文地址:http://www.cnblogs.com/seawaving/archive/2012/12/04/2801988.html

    4. 添加一个模型

    · 原文地址:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-a-model

    · 译文地址:http://www.cnblogs.com/seawaving/archive/2012/12/05/2803012.html

    5. 从控制器访问数据模型

    · 原文地址:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/accessing-your-models-data-from-a-controller

    · 译文地址:http://www.cnblogs.com/seawaving/archive/2012/12/05/2803429.html

    6.查看Edit方法和Edit视图

    · 原文地址:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/examining-the-edit-methods-and-edit-view

    · 译文地址:http://www.cnblogs.com/seawaving/archive/2012/12/05/2804100.html

           http://www.cnblogs.com/seawaving/archive/2012/12/06/2804590.html

    7. 为Movie模型和库表添加字段

    · 原文地址:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-a-new-field-to-the-movie-model-and-table

    · 译文地址:http://www.cnblogs.com/seawaving/archive/2012/12/06/2805401.html

    8. 为模型添加验证

    · 原文地址:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-validation-to-the-model

    · 译文地址:http://www.cnblogs.com/seawaving/archive/2012/12/06/2806322.html

    9. 查看Detail和Delete方法

    · 原文地址:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/examining-the-details-and-delete-methods

    · 译文地址:http://www.cnblogs.com/seawaving/archive/2012/12/10/2811064.html

  • 相关阅读:
    linux tomcat 突然验证码出不来
    使用open live writer客户端写博客
    创建自己的maven模板
    Dynamic Web Module 3.0 requires Java 1.6 or newer
    win10 操作配置备忘
    Maven使用
    ORA-12514: TNS:listener does not currently know of service …
    PlantUML——4.实例演示1
    C语言基础(一)
    Linux系统挂载FAT32的U盘
  • 原文地址:https://www.cnblogs.com/seawaving/p/2804590.html
Copyright © 2011-2022 走看看