快捷搜索:

【Asp.Net MVC 4官方教程】6、验证编辑方法和编辑视

在本节中,您将开始改动为片子节制器所新加的操作措施和视图。然后,您将添加一个自定义的搜索页。

在浏览器地址栏里追加/Movies, 浏览到Movies页面。并进入编辑(Edit)页面。

Edit(编辑)链接是由Views\Movies\Index.cshtml视图中的Html.ActionLink措施所天生的:

@Html.ActionLink("Edit", "Edit", new { id=item.ID })

Html工具是一个Helper, 以属性的形式, 在System.Web.Mvc.WebViewPage基类上公开。 ActionLink是一个赞助措施,便于动态天生指向Controller中操作措施的HTML 超链接链接。ActionLink措施的第一个参数是想要出现的链接文本 (例如,Edit Me)。第二个参数是要调用的操作措施的名称。着末一个参数是一个匿名工具,用来天生路由数据 (在本例中,ID 为 4 的)。

在上图中所天生的链接是http://localhost:xxxxx/Movies/Edit/4默认的路由 (在App_Start\RouteConfig.cs 中设定) 应用的 URL 匹配模式为: {controller}/{action}/{id}。是以,ASP.NET 将http://localhost:xxxxx/Movies/Edit/4转化到Movies 节制器中Edit操作措施,参数ID即是 4 的哀求。查看App_Start\RouteConfig.cs文件中的以下代码。

public static void RegisterRoutes(RouteCollection routes)

{routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.MapRoute(name: "Default",

url: "{controller}/{action}/{id}",defaults: new { controller = "Home", action = "Index",

id = UrlParameter.Optional });

}

您还可以应用QueryString来通报操作措施的参数。例如,URL: http://localhost:xxxxx/Movies/Edit?ID=4还会将参数ID为 4的哀求通报给Movies节制器的Edit操作措施。

打开Movies节制器。如下所示的两个Edit操作措施。

//

// GET: /Movies/Edit/5

public ActionResult Edit(int id = 0)

{

Movie movie = db.Movies.Find(id);if (movie == null)

{return HttpNotFound();

}return View(movie);

}

//

// POST: /Movies/Edit/5

[HttpPost]

public ActionResult Edit(Movie movie)

{

if (ModelState.IsValid){

db.Entry(movie).State = EntityState.Modified;db.SaveChanges();

return RedirectToAction("Index");}

return View(movie);

}

留意,第二个Edit操作措施的上面有HttpPost属性。此属性指定了Edit措施的重载,此措施仅被POST 哀求所调用。您可以将HttpGet属性利用于第一个编辑措施,但这是不需要的,由于它是默认的属性。(操作措施会被隐式的指定为HttpGet属性,从而作为HttpGet措施。)

HttpGet Edit措施会获取片子ID参数、 查找影片应用Entity Framework 的Find措施,并返回到选定影片的编辑视图。假如不带参数调用Edit 措施,ID 参数被指定为默认值 零。假如找不到一部片子,则返回HttpNotFound 。当VS自动创建编辑视图时,它会查看Movie类并为类的每个属性创建用于Render的和的元素。下面的示例为自动创建的编辑视图:

@model MvcMovie.Models.Movie

@{

ViewBag.Title = "Edit";

}

Edit

@using (Html.BeginForm()) {@Html.ValidationSummary(true)

Movie

@Html.HiddenFor(model => model.ID)

class="editor-label">

@Html.LabelFor(model => model.Title)

class="editor-field">@Html.EditorFor(model => model.Title)

@Html.ValidationMessageFor(model => model.Title)

class="editor-label">@Html.LabelFor(model => model.ReleaseDate)

class="editor-field">

@Html.EditorFor(model => model.ReleaseDate)@Html.ValidationMessageFor(model => model.ReleaseDate)

class="editor-label">

@Html.LabelFor(model => model.Genre)

class="editor-field">@Html.EditorFor(model => model.Genre)

@Html.ValidationMessageFor(model => model.Genre)

class="editor-label">@Html.LabelFor(model => model.Price)

class="editor-field">

@Html.EditorFor(model => model.Price)@Html.ValidationMessageFor(model => model.Price)

"submit" value="Save" />

}

@Html.ActionLink("Back to List", "Index")

@section Scripts {

@Scripts.Render("~/bundles/jqueryval")

}

留意,视图模板在文件的顶部有 @model MvcMovie.Models.Movie 的声明,这将指定视图期望的模型类型为Movie。

自动天生的代码,应用了Helper措施的几种简化的 HTML 标记。 Html.LabelFor 用来显示字段的名称("Title"、"ReleaseDate"、"Genre"或"Price")。 Html.EditorFor 用来出现 HTML 元素。Html.ValidationMessageFor 用来显示与该属性相关联的任何验证消息。

运行该利用法度榜样,然后浏览URL,/Movies。单击Edit链接。在浏览器中查看页面源代码。HTML Form中的元素如下所示:

form action="/Movies/Edit/4" method="post">fieldset>

legend>Movielegend>

input data-val="true" data-val-number="The field ID must be a number." data-val-required="The ID field is required." id="ID" name="ID" type="hidden" value="4" />

div class="editor-label">label for="Title">Titlelabel>

div>div class="editor-field">

input class="text-box single-line" id="Title" name="Title" type="text" value="Rio Bravo" />span class="field-validation-valid" data-valmsg-for="Title" data-valmsg-replace="true">span>

div>

div class="editor-label">

label for="ReleaseDate">ReleaseDatelabel>div>

div class="editor-field">input class="text-box single-line" data-val="true" data-val-date="The field ReleaseDate must be a date." data-val-required="The ReleaseDate field is required." id="ReleaseDate" name="ReleaseDate" type="text" value="4/15/1959 12:00:00 AM" />

span class="field-validation-valid" data-valmsg-for="ReleaseDate" data-valmsg-replace="true">span>div>

div class="editor-label">label for="Genre">Genrelabel>

div>div class="editor-field">

input class="text-box single-line" id="Genre" name="Genre" type="text" value="Western" />span class="field-validation-valid" data-valmsg-for="Genre" data-valmsg-replace="true">span>

div>

div class="editor-label">

label for="Price">Pricelabel>div>

div class="editor-field">input class="text-box single-line" data-val="true" data-val-number="The field Price must be a number." data-val-required="The Price field is required." id="Price" name="Price" type="text" value="2.99" />

span class="field-validation-valid" data-valmsg-for="Price" data-valmsg-replace="true">span>div>

p>input type="submit" value="Save" />

p>fieldset>

form>

被 HTML 元素所包括的元素会被发送到,form的action属性所设置的URL:/Movies/Edit。单击Edit按钮时,from数据将会被发送到办事器。

处置惩罚 POST 哀求

下面的代码显示了Edit操作措施的HttpPost处置惩罚:

[HttpPost]

public ActionResult Edit(Movie movie)

{

if (ModelState.IsValid){

db.Entry(movie).State = EntityState.Modified;db.SaveChanges();

return RedirectToAction("Index");}

return View(movie);

}

ASP.NET MVC 模型绑定 接管form所post的数据,并转换所接管的movie哀求数据从而创建一个Movie工具。ModelState.IsValid措施用于验证提交的表单数据是否可用于改动(编辑或更新)一个Movie工具。假如数据是有效的片子数据,将保存到数据库的Movies聚拢(MovieDBContext instance)。经由过程调用MovieDBContext的SaveChanges措施,新的片子数据会被保存到数据库。数据保存之后,代码会把用户重定向到MoviesController类的Index操作措施,页面将显示片子列表,同时包括刚刚所做的更新。

假如form发送的值不是有效的值,它们将从新显示在form中。Edit.cshtml视图模板中的Html.ValidationMessageFor Helper将用来显示响应的差错消息。

留意,为了使jQuery支持应用逗号的非英语区域的验证 ,必要设置逗号(",")来表示小数点,你必要引入globalize.js并且你还必要详细的指定cultures/globalize.cultures.js文件 (地址在https://github.com/jquery/globalize) 在 JavaScript 中可以应用 Globalize.parseFloat。下面的代码展示了在"FR-FR" Culture下的 Views\Movies\Edit.cshtml 视图:

@section Scripts {

@Scripts.Render("~/bundles/jqueryval")script src="~/Scripts/globalize.js">script>

script src="~/Scripts/globalize.culture.fr-FR.js">script>script>

$.validator.methods.number = function (value, element) {return this.optional(element) ||

!isNaN(Globalize.parseFloat(value));}

$(document).ready(function () {Globalize.culture('fr-FR');

});script>

script>jQuery.extend(jQuery.validator.methods, {

range: function (value, element, param) {//Use the Globalization plugin to parse the value

var val = $.global.parseFloat(value);return this.optional(element) || (

val >= param[0] && val = param[1]);}

});

script>

}

十进制字段可能必要逗号,而不是小数点。作为临时的修复,您可以向项目根 web.config 文件添加的举世化设置。下面的代码演示设置为美国英语的举世化文化设置。

system.web>

globalization culture ="en-US" />

system.web>

所有HttpGet措施都遵照类似的模式。它们获取影片工具 (或工具聚拢,如Index里的工具聚拢),并将模型通报给视图。Create措施将一个空的Movie工具通报给创建视图。创建、 编辑、 删除或以其它要领改动数据的措施都是HttpPost措施。应用HTTP GET 措施来改动数据是存在安然风险,在ASP.NET MVC Tip #46 – Don’t use Delete Links because they create Security Holes的Blog中有完备的论述。在 GET 措施中改动数据还违反了 HTTP 的最佳做法和Rest架构模式, GET 哀求不应变动利用法度榜样的状态。换句话说,履行 GET 操作,应该是一种安然的操作,没有任何副感化,不会改动您持久化的数据。

添加一个搜索措施和搜索视图

在本节中,您将添加一个搜索片子流派或名称的SearchIndex操作措施。这将可应用/Movies/SearchIndex URL。该哀求将显示一个 HTML 表单,此中包孕输入的元素,用户可以输入一部要搜索的片子。当用户提交窗体时,操作措施将获取用户输入的搜索前提并在数据库中搜索。

显示 SearchIndex 窗体

经由过程将SearchIndex操作措施添加到现有的MoviesController类开始。该措施将返回一个视图包孕一个 HTML 表单。如下代码:

public ActionResult SearchIndex(string searchString)

{

var movies = from m in db.Moviesselect m;

if (!String.IsNullOrEmpty(searchString))

{movies = movies.Where(s => s.Title.Contains(searchString));

}

return View(movies);

}

您可能还会对下面的文章感兴趣: