第九章 设计用户界面 之 设计实现界面行为

1. 概述

  本章内容包括: 实现客户端验证、使用Javascript和DOM控制程序行为、使用原型继承(prototypal inheritance)扩展对象、使用Ajax实现页面局部刷新、使用JQuery实现UI操作。

2. 主要内容

  2.1 实现客户端验证

    ① 模型: 在MVC程序中,模型 负责管理应用程序的数据和行为。模型也可以用来验证进入程序的数据。

    data annotation是可以放置到每一个属性上的规则,用来实现数据验证。

using System; using System.Data.Entity; using System.ComponentModel.DataAnnotations; namespace ArticleApp.Models { public class Article { public int ID { get; set; } [Required] [StringLength(50,MinimumLength=5)] public string Title { get; set; } [RegularExpression[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}")] 
        AuthorEmail { get; set;} [DataType(DataType.Date)] [Range(300, 3000)] public int NumberOfAuthors { get; set; } [Required] public DateTime CreateDate { get; set; } [Required] public string Description { get; set; } [Range(1, 250)] [DataType(DataType.Currency)] [Required] public decimal Price { get; set; } } public class ArticleDBContext : DbContext { public DbSet<Article> Articles { get; set; } } }

    ② 视图:在MVC程序中,视图用来管理信息的显示。

    模型层定义的数据验证规则会传递到视图层,然后可以使用客户端的Javascript来验证。

@model MvcApplication1.Models.Article @{ ViewBag.Title = "Create"; } <h2>Create</h2> @using (Html.BeginForm()) { @Html.ValidationSummary(true) <fieldset> 
        <legend>Articles</legend> 
        <div class="editor-label"> @Html.LabelFor(model => model.Title) </div> 
        <div class="editor-field"> @Html.EditorFor(model => model.Title) @Html.ValidationMessageFor(model => model.Title) </div> 
        <div class="editor-label"> @Html.LabelFor(model => model.CreateDate) </div> 
        <div class="editor-field"> @Html.EditorFor(model => model.CreateDate) @Html.ValidationMessageFor(model => model.CreateDate) </div> 
        <div class="editor-label"> @Html.LabelFor(model => model.Description) </div> 
        <div class="editor-field"> @Html.EditorFor(model => model.Description) @Html.ValidationMessageFor(model => model.Description) </div> 
        <div class="editor-label"> @Html.LabelFor(model => model.Price) </div> 
        <div class="editor-field"> @Html.EditorFor(model => model.Price) @Html.ValidationMessageFor(model => model.Price) </div> 
                <p> 
            <input type="submit" value="Create" /> 
        </p> 
    </fieldset> } <div> @Html.ActionLink("Back to List", "Index") </div> @section Scripts { @Scripts.Render("~/bundles/jqueryval") }

第九章 设计用户界面 之 设计实现界面行为_第1张图片

    ③ 控制器:控制器基类的ModelState属性,包含一些model特性的方法,比较常用的是IsValid属性。

[HttpPost] public ActionResult Create(Article article) { if (ModelState.IsValid) { db.Articles.Add(article); db.SaveChanges(); return RedirectToAction("Index"); } return View(article); }

    ④ 远程验证

      由服务端的action来执行验证操作。

public JsonResult IsUserAvailable(string username) { if (!WebSecurity.UserExists(username)) { return Json(true, JsonRequestBehavior.AllowGet); //AllowGet表示如果用户接受这个返回值,则验证不会重复执行。 } string suggestedUID = String.Format(CultureInfo.InvariantCulture, "{0} is not available.", username); for (int i = 1; i < 100; i++) { string altCandidate = username + i.ToString(); if (!WebSecurity.UserExists(altCandidate)) { suggestedUID = String.Format(CultureInfo.InvariantCulture, "{0} is not available. Try {1}.", username, altCandidate); break; } } return Json(suggestedUID, JsonRequestBehavior.AllowGet); }

      为了确保UI能调用到验证action,需要在模型层添加System.Web.Mvc.Remote 属性。

[Required] [StringLength(6, MinimumLength = 3)] [Remote("IsUserAvailable", "Validation")] [RegularExpression(@"(\S)+", ErrorMessage = "White space is not allowed.")] [Editable(true)] public string UserName { get; set; }

      还需要修改配置文件以允许服务端远程验证

<appSettings> 
    <add key="ClientValidationEnabled" value="true" /> 
    <add key="UnobtrusiveJavaScriptEnabled" value="true" /> 
</appSettings>

  2.2 使用Javascript和DOM控制程序行为

    通过访问DOM,Javascript可以展现出强大的控制UI的能力。

<script type="text/javascript"> 
    function changeText(){ document.getElementById('controlled').innerHTML = 'This is modified text'; } </script> 
<p id="controlled">This is sample text.</p> 
<input type='button' onclick='changeText()' value='Change Text'/>

  2.3 使用原型继承(prototypal inheritance)扩展对象

    Javascript是一种基于原型的解释型脚本语言。与面向对象语言的最明显区别是,Javascript没有类,只有对象。

    可以基于现有对象创建一系列的原型对象,从而实现对象的扩展功能。

var Contact = function(pageTitle) { this.pageTitle = pageTitle; this.bindEvents(); // binding events as soon as the object is instantiated 
    this.additionalEvents(); // additional events such as DOM manipulation etc 
}; var Contact.prototype.bindEvents = function() { $('ul.menu').on('click', 'li.email, $.proxy(this.toggleEmail, this)); }; var Contact.prototype.toggleEmail = function(e) { //Toggle the email feature on the page };
<script src="/path_to_script_from_above/contact.js"></script> 
<script> 
    new Contact("Contact Us"); </script>

  2.4 使用Ajax实现页面局部刷新

    System.Web.MVC.Ajax命名空间中提供了一些方法来简化Ajax开发。

@model MvcApplication1.Models.Article @{ ViewBag.Title = "Create"; } <link rel="stylesheet" href="http://code.jquery.com/ui/1.9.2/themes/base/jquery-ui.css" 
/> 
    <script src="http://code.jquery.com/jquery-1.8.3.js"></script> 
    <script src="http://code.jquery.com/ui/1.9.2/jquery-ui.js"></script> 
    <link rel="stylesheet" href="/resources/demos/style.css" /> 
    <script> $(function() { $(".ReleaseDate").datepicker(); }); </script> 
<h2>Create</h2> @using (Ajax.BeginForm("PerformAction", new AjaxOptions { OnSuccess = "OnSuccess", OnFailure = "OnFailure" })) { <fieldset> 
    <legend>Article</legend> 
    <div class="editor-label"> @Html.LabelFor(model => model.Title) </div> 
    <div class="editor-field"> @Html.EditorFor(model => model.Title) @Html.ValidationMessageFor(model => model.Title)

    </div>

    <p>
      <input type="submit" value="Create" />
    </p>

    </fieldset> } <p id="errorMessage"/> 
<script type="text/javascript"> 
    function OnSuccess(response) { //do something 
 } function OnFailure(response) { //show failure 
 document.getElementById('errorMessage').innerHTML = 'THERE WAS AN ERROR'; } </script> 
<div> @Html.ActionLink("Back to List", "Index") </div> @section Scripts { @Scripts.Render("~/bundles/jqueryval") }

  2.5 使用JQuery实现UI操作

    JQuery在 操作DOM、动画、事件处理等方面都提供了易用的功能。还包括浏览器兼容性方面。

3. 总结

  ① 客户端验证是Javascript和ASP.NET MVC支持的重要特性。用于在客户端检测是否有非法的数据进入程序。

  ② 第三方Javascript库,包括JQuery,在MVC程序的UI设计中很有用。通过访问DOM,Javascript可以完全控制UI的各个方面,且不需要服务端的交互。

  ③ JQuery不单单是提供了一些UI控件,在动画、事件处理方面也有很好的支持。并且兼容大部分的主流浏览器。

  ④ Javascript中,可以通过prototype来扩展现有对象的功能。

  ⑤ 合理使用Ajax,可以开发出动态的、快速响应的、流畅的程序。

你可能感兴趣的:(第九章 设计用户界面 之 设计实现界面行为)