zoukankan      html  css  js  c++  java
  • MVC-04 视图(2)

    三、View如何从Aciton取得数据

        从Action取得数据,在ASP.NET MVC可区分成两种方式,一种是“使用弱类型取得数据”,另一种则是“使用强类型取得数据”,两者的差别在于View页面最上方声明的方式。

        如果View页面使用弱类型接收来自Controller的数据,在View页面里完全不需要有任何声明,数据可以从ViewData、ViewBag或TempData取得,在页面中也可以通过@Model属性,取得从Action传来的ViewData.Model数据模型,但@Model数据模型的类型将会是object,所以算是弱类型的传值方式。

        如果View页面使用强类型方式接收来自Controller的数据,那么,必须在View页面的第一行使用@model关键字引入一个View页面专用的数据模型类型参考。使用这种方式有助于提升View的开发效率,因为可以使用Visual Studio 2012的Intellisense提示功能。

    1.使用弱类型模型取得数据

    2.使用强类型模型取得数据

    四、HTML辅助方法

        顾名思义,HTML辅助方法(HTML Helper)就是用来辅助产生HTML只用,在开发View的时候一定会面对许多HTML标签,处理这些HTML的工作非常繁琐,为了降低View的复杂度,可以使用HTML辅助方法帮助你产生一些HTML标签或内容,因这些HTML标签都有固定标准的写法,所以将其包装成HTML辅助方法,可让View开发更快速,也可以避免不必要的语法错误。

        ASP.NET MVC中内建了许多HTML辅助方法,这些HTML辅助方法都是利用C#3.0的扩充方法特性,将各种不同的HTML辅助方法扩充在HtmlHelper类别里,并且都拥有多载。

    1.使用HTML辅助方法输出超链接

    @Html.ActionLink("链接文字","ActionName")

    @Html.ActionLink("链接文字","ActionName","ControllerName")

    @Html.ActionLink("链接文字","ActionName",new{id=123,page=5})

    @Html.ActionLink("链接文字","ActionName",null,new{@class="btnLink"})

        使用Html.AcionLink()时,第一个参数为超链接的显示文字,此参数不可以输入空字符串、空白字符串或null值,否则会跑出The Value cannot be null or empty的异常。

        如果想设计一个包含超链接的图片按钮,可选择用<a>超链接标签来输出,并通过CSS加上一个背景图,如下。

    <a href="@Url.Action("ActionName")" class="lnkButton"></a>

        ASP.NET MVC还有另一个Html.RouteLink辅助方法,其用法与Html.ActionLink非常相似,差别仅在于输入的参数要以RouteValue为主。

    2.使用HTML辅助方法输出表单

    (1)产生表单元素

        使用using语法产生表单标签:

    @using(Html.BeginForm("About","Home"))
    {
        @Html.TextArea("Date")
        @Html.TextArea("MEMO")
        <input type="submit"/>
    }

        使用Html.BeginForm辅助方法输出的表单预设输出的method属性会是POST,如果想指定为GET的话,可以输入第三个参数,如下。

    @using(Html.BeginForm("Search","Home",FormMethod.Get))
    {
        @Html.TextArea("Keyword")
        <input type="submit" />
    }

        如果想要用HTML表单实现文件上传的功能,那么必须在输出的<form>表单标签加上一个enctype属性,且内容必须设定为multipart/form-data,如下。

    @using(Html.BeginForm("Upload","File",FormMethod.Post,new{enctype="multipart/form-data"}))
    {
        @Html.TextBox("File1","",new{type="file",size="25"})
        <input type="submit"/>
    }

        Html辅助方法并没有File方法,因此必须用TextBox方法来代替,并传入第三个参数将内建的type属性换成file即可。

    (2)模拟各种HTTP动词

        由于HTML表单无法送出DELETE这个HTTP动词,如果希望Action能够提供如同RESTful风格的方式来处理删除动作,又同时能够利用同一个表单来使用这个只能允许HttpDelete的动作的话,可以利用Html.HttpMethodOverride这个HTML辅助方法来模拟HTTP DELETE的行为,而模拟的方法其实只是加入一个隐藏栏位在表单里而已。

    @using(Html.BeginForm("DeleteMessage","Message")
    {
        @Html.HttpMethodOverride(HttpVerbs.Delete)
        @Html.Hidden("ID")
        <input type="submit" value="删除此条数据" />
    }

    (3)常用表单输入栏位

    Html.BeginForm()

    Html.EndForm()

    Html.Label()

    Html.TextBox()

    Html.TextArea()

    Html.Password()

    Html.CheckBox()

    Html.RadionButton()

    Html.DropDownList(),输出<select>标签。

    Html.ListBox()

    Html.Hidden()

    Html.ValidationSummary()

    Html.Id()

    Html.Name()

    Html.Value()

        标签和文本框使用如下:

    @Html.Label("Username","账户")
    @Html.TextBox("Username")

        标签for属性的值与input的id属性值一致的话,点击标签光标就会停留在文本框上,增加表单的易用性。Html.TextBox的多载如下:

    @Html.TextBox("Username", "will")
    @Html.TextBox("Username", "will", new { id="testID"})
            public ActionResult HelperSample1()
            {
                IDictionary<string, object> attr = new Dictionary<string, object>();
                attr.Add("size", "32");
                attr.Add("style", "color:red;");
                ViewData["Dictionary"] = attr;
                return View();
            }
    @{
        var htmlAttribute = ViewData["Dictionary"] as IDictionary<string, object>;
    }
    @Html.TextBox("name","Value",htmlAttribute)<br />
    @Html.Password("password","Value",htmlAttribute)<br />
    @Html.TextBox("email","Value",htmlAttribute)<br />
    @Html.TextBox("tel","Value",htmlAttribute)<br />
    @Html.Hidden("id","1")

        Html.DropDownList()的使用方式如下。

            public ActionResult HelperSample2()
            {
                List<SelectListItem> listItem = new List<SelectListItem>();
                listItem.Add(new SelectListItem { Text = "", Value = "1" });
                listItem.Add(new SelectListItem { Text = "", Value = "0" });
                ViewData["List"] = new SelectList(listItem, "Value", "Text", "");
                return View();
            }
    @Html.DropDownList("List", ViewData["List"] as SelectList, "请选择")

    (4)使用强类型辅助方法

        ASP.NET MVC从2.0版开始更进一步地提供了强类型的辅助方法,避免因为输入错误而导致数据没有显示或是编辑时无法存储的问题,除此之外,如果能活用这些强类型辅助方法还能提升整体开发效率。

        基本上,属于强类型的辅助方法命名方式皆为“原先的名称最后加上For”,例如,Html.TextBoxFor()或Html.LabelFor()。使用强类型辅助方法,在View页面的最上方一定要用@model定义出这个View页面的参考数据模型。

    Html.LabelFor(),显示字段的名字。

    Html.TextBoxFor()

    Html.TextAreaFor()

    Html.PasswordFor()

    Html.CheckBoxFor()

    Html.RadioButtonFor()

    Html.DropDownListFor()

    Html.ListBoxFor()

    Html.HiddenFor() ,生成HTML窗体的隐藏域。

    Html.NameFor()

    Html.ValueFor()

    Html.DisplayNameFor(),获取模型的显示名称,有时是模型实体类的名称。

    Html.DisplayTextFor()

    Html.ValidationMessageFor(),是用来显示字段验证的错误消息

    Html.EditorFor(),用来输出表单域可编辑文本框。

        做一个例子,首页显示商品明细,点击添加商品链接,打开添加商品页面,输入信息可添加商品。商品的模型类和添加商品页面代码如下:

        public class Product
        {
            public int Id { get; set; }
    
            [Required]
            [DisplayName("产品名称")]
            public string Name { get; set; }
    
            [MaxLength(200)]
            [DisplayName("产品说明")]
            public string Description { get; set; }
    
            [Required]
            public int UnitPrice { get; set; }
        }
    @model MvcApplication1.Models.Product
    
    @using(Html.BeginForm())
    {
        @Html.ValidationSummary(true)
    
        <fieldset>
            <legend>产品资讯</legend>
    
            <div class="editor-lable">
                @Html.LabelFor(model=>model.Name)
            </div>
            <div class="editor-field">
                @Html.TextBoxFor(model=>model.Name)
                @Html.ValidationMessageFor(model=>model.Name)
            </div>
    
            <div class="editor-label">
                @Html.LabelFor(model=>model.Description)
            </div>
            <div class="editor-label">
                @Html.TextAreaFor(model=>model.Description)
                @Html.ValidationMessageFor(model=>model.Description)
            </div>
    
            <p>
                <input type="submit" />
            </p>
        </fieldset>
    }

    3.使用HTML辅助方法载入分部视图

        以往在ASP.NET Web form的开发经验中,对于User Control使用非常频繁,不但可以减少重复的代码,也利于将页面模块化,这个好用的概念也可以用在ASP.NET MVC中,只不过换了一个名字,称为“分部视图(Partial View)”。

    (1)什么是分部视图

        从Partial View的字面上翻译,很容易了解它就是一个片段的View,因此,可以利用Partial View把部分的HTML或显示逻辑包装起来,方便重复引用。当你将建立出来的分部视图放置于ViewShared目录时,任何Controller下的Action或View都可以载入。

        分部视图的应用范围相当广,因为是片段的HTML或显示逻辑,因此,整体重复性高或某段HTML会共同出现在多个视图页面中的网页片段,利用分部视图来开发会是不错的选择,并且基于这个优点,Ajax技术所需要的片段View也就更适合使用分部视图。

    (2)如何建立一个分部视图

        建立分部视图与建立视图的步骤一样,在项目的/Views/Shared目录上,单击鼠标右键,在弹出的快捷菜单中选择“添加”->“视图”命令。接着,选中“创建为分部视图”复选框即可。

        使用分部视图不一定需要建立相关的Action,因为它仅仅是片段的HTML,且调用时,也不会调用Action来执行。

    (3)如何载入分部视图

    Partial(HtmlHelper, String)                                          |    Html.Partial("ajaxPage")

    Partial(HtmlHelper, String, Object)                               |    Html.Partial("ajaxPage", Model)

    Partial(HtmlHelper, String, ViewDataDictionary)            |    Html.Partial("ajaxPage", ViewData["Model"])

    Partial(HtmlHelper, String, Object, ViewDataDictionary) |    Html.Partial("ajaxPage", Model, ViewData["Model"])

        例子1,分部视图OnlineUserCounter代码如下。

    <span style="color:red">线上人数:88888</span>

        在Home/Index视图中载入分部视图。

    @Html.Partial("OnlineUserCounter")

    (4)从控制器载入分部视图

    (5)使用Html.Action辅助方法载入分部视图

    4.使用视图模板输出内容

    5.自定义HTML辅助方法

        使用HTML辅助方法可以让开发View页面的过程节省不少时间,但有时候难免会觉得内建的HTML辅助方法不太够用,怎么办才好呢?ASP.NET MVC的另一项优点就是“高扩充性”,此刻就派上用场。ASP.NET MVC允许开发人员自行扩充HTML辅助方法,而且方法众多,你可以选择喜爱的方式来建立适当的HTML辅助方法。

     6.Html.ValidationSummary()可以输出表单验证失败时的错误信息摘要

    下面哪个HTML辅助方法,可以输出表单验证失败时的错误信息摘要(    )。

    A.Html.Hidden        B. Html.ValidationSummary()

    C.Html.ErrorMsg()    D.Html.ValidationMsg()

  • 相关阅读:
    052 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 14 Eclipse下程序调试——debug2 多断点调试程序
    051 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试——debug入门1
    050 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 12 continue语句
    049 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 11 break语句
    048 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 10 案例——阶乘的累加和
    047 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 09 嵌套while循环应用
    046 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 08 for循环的注意事项
    045 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 07 for循环应用及局部变量作用范围
    剑指OFFER----面试题04.二维数组中的查找
    剑指OFFER----面试题03. 数组中重复的数字
  • 原文地址:https://www.cnblogs.com/meetyy/p/3466538.html
Copyright © 2011-2022 走看看