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


    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") 
    }

        ③ 控制器:控制器基类的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,可以开发出动态的、快速响应的、流畅的程序。

  • 相关阅读:
    BZOJ 3522 Hotel
    BZOJ 1864 三色二叉树
    396595
    CodeForces
    CodeForces
    CodeForces
    E. 数字串
    算术基本定理总结
    Cyclic Nacklace 杭电3746
    Period
  • 原文地址:https://www.cnblogs.com/stone_lv/p/5049003.html
Copyright © 2020-2023  润新知