精通ASP.NET MVC ——辅助器方法

辅助器方法(Helper Method),其作用是对代码块和标记进行打包,以便能够在整个MVC框架应用程序中重用。

首先新建一个项目,添加一个Home控制器,如下图所示:

    public class HomeController : Controller{// GET: Homepublic ActionResult Index(){ViewBag.Fruits = new string[] { "Apple", "Orange", "Pear" };ViewBag.Cities = new string[] { "New York","London","Paris"};string message = "This is an HTML element:<input>";return View((object)message);}}

对应的视图Index.cshtml页面,代码如下图所示: 


@{Layout = null;
}<!DOCTYPE html><html>
<head><meta name="viewport" content="width=device-width" /><title>Index</title>
</head>
<body><div> Here are the fruites:@foreach (string str in (string [])ViewBag.Fruits){<b>@str</b>}</div><div>Here are the cities:@foreach (string str in (string [])ViewBag.Cities){<b>@str</b>}</div><div>Here is the message:<p>@Model</p></div>
</body>
</html>

运行效果如下图所示: 

            


创建内联的自定义辅助器方法

修改Index.cshtml页面,代码如下图所示:


@{Layout = null;
}@helper ListArrayItems(string [] items) { foreach (string str in items){<b>@str</b>}
}<!DOCTYPE html>
<html>
<head><meta name="viewport" content="width=device-width" /><title>Index</title>
</head>
<body><div> Here are the fruites:@ListArrayItems(ViewBag.Fruits)</div><div>Here are the cities:@ListArrayItems(ViewBag.Cities)</div><div>Here is the message:<p>@Model</p></div>
</body>
</html>

在上述代码中,定义了一个名称为ListArrayItems的辅助器,它以一个字符串数组为参数。 虽然内联辅助器看上去像一个方法。但是它没有返回值。这种办法的好处是,如果希望改变数组内容显示的方式,只需要一处修改,如下图所示:

@helper ListArrayItems(string [] items) {<ul>@foreach (string str in items){<li>@str</li>}</ul>
}

运行效果如下图所示: 

                           


创建外部辅助器方法 

内联辅助器是方便的,但是只能在声明它们的视图之中使用,而且,如果内联辅助器太复杂,可能会占据视图,影响阅读。这时就可以用到外部辅助器方法。在项目中添加一个Infrastructure文件夹,并创建一个新的类文件CustomHelp.cs,如下图所示:

    public static class CustomerHelpers{public static MvcHtmlString ListArrayItems(this HtmlHelper html,string[] list){TagBuilder tag = new TagBuilder("ul");foreach (string str in list){TagBuilder itemTag = new TagBuilder("li");itemTag.SetInnerText(str);tag.InnerHtml += itemTag.ToString();}return new MvcHtmlString(tag.ToString());}}

 辅助器方法的第一个参数是HtmlHelper对象,它以this关键字为前缀,告诉C#编译器,这是一个扩展方法。HtmlHelper能够在创建内容时,对有用信息进行访问,如下图所示:

HtmlHelper类定义的有用属性
属性描述
RouteCollection返回应用程序定义的路由集合
ViewBag返回视图包数据,这些数据是从动作方法传递给调用辅助器方法的视图的
ViewContext返回ViewContext对象,该对象能够对请求的细节以及请求的处理方式进行访问
ViewContext类定义的有用的属性
属性描述
Controller返回处理当前请求的控制器
HttpContext返回描述当前请求的HttpContext对象
IsChildAction如果已调用辅助器的视图正由一个子动作渲染,则返回true
RouteData返回请求的路由数据
View返回调用辅助器方法的IView实现的实例

 创建HTML最容易的方式是使用TagBuilder类,它能够建立HTML字符串,而不需要处理转义及特殊字符串。

TagBuilder类的一些成员
成员描述
InnerHtml这是一个以HTML字符串来设置元素内容的属性。赋给这个属性的值将不进行编码,意即可以将它嵌入HTML元素。
SetInnerText(string)设置HTML元素的文本内容。string参数将被编码,以使它安全显示。
AddCssClass(string)对HTML元素添加一个CSS的class
MergeAttribute(string,string,bool)对HTML元素添加一个属性,第一个参数是属性名称,第二是它的值,bool参数指定是否替换已存在的同名属性。

使用自定义的外部辅助器方法 

@model string
@using WebApplication1.Infrastructure
@{Layout = null;
}<!DOCTYPE html>
<html>
<head><meta name="viewport" content="width=device-width" /><title>Index</title>
</head>
<body><div> Here are the fruites:@Html.ListArrayItems((string [])ViewBag.Fruits)</div><div>Here are the cities:@Html.ListArrayItems((string[])ViewBag.Cities)</div><div>Here is the message:<p>@Model</p></div>
</body>
</html>

运行效果还是一样:

                           

 


辅助器方法中的字符串编码 

MVC框架会保护你免收恶意数据的攻击,这是通过对数据进行自动编码实现的。

如Controller中代码是这样的:

                

View的显示结果是这样的: 

                  

而MVC框架会认为辅助器方法生成内容是安全的。辅助器方法会在浏览器端显示input元素,而这个这可能会被利用以破坏程序的行为。在CustomerHelpers定义一个新的辅助方法看看这一情况:

        public static MvcHtmlString DisplayMessage(this HtmlHelper html, string msg){string result = string.Format("This is the message:<p>{0}</p>",msg);return new MvcHtmlString(result);}

修改Index.cshtml页面如下所示:

@model string
@using WebApplication1.Infrastructure
@{Layout = null;
}<!DOCTYPE html>
<html>
<head><meta name="viewport" content="width=device-width" /><title>Index</title>
</head>
<body><div> Here are the fruites:@Html.ListArrayItems((string [])ViewBag.Fruits)</div><div>Here are the cities:@Html.ListArrayItems((string[])ViewBag.Cities)</div><p> This is content from the view</p><div style="border:thin solid black; padding:10px"></div><div>Here is the message:<p>@Model</p></div><p> This is content from the helper method</p><div style="border:thin solid black; padding:10px"></div><div>Here is the message:<p>@Html.DisplayMessage(Model)</p></div></body>
</html>

运行效果如下图所示:

              


 对辅助器方法的内容进行编码

有两种方式:第一种最简单的解决办法是将辅助器方法的返回值类型改为string。但是这种方式在需要生成HTML元素时可能会有问题,不需要生成HTML元素时会比较简单,如下图所示:

        public static string DisplayMessage(this HtmlHelper html, string msg){string result = string.Format("This is the message:<p>{0}</p>", msg);return result;}

运行情况如下图所示,对p元素也进行了编码: 

          

第二种方式是用HtmlHelp类中定义的Encode方法 ,选择性的对数据进行编码,代码如下图所示:

        public static MvcHtmlString DisplayMessage(this HtmlHelper html, string msg){string encodedMessage = html.Encode(msg);string result = string.Format("This is the message:<p>{0}</p>", encodedMessage);return new MvcHtmlString(result);}

运行情况如下图所示: 

           


 使用内建的Form辅助器方法

BeginForm辅助器方法的重载
重载描述
BeginForm()创建一个表单,回递给源动作方法(源动作方法指引发渲染该表单的动作方法)
BeginForm(action,controller)创建一个表达,回递给以字符串形式指定的动作方法和控制器
BeginForm(action,controller,method)上一个方法的重载版本,但可以用System.Web.Mvc.FormMethod枚举一个值,来指定form元素中的method标签属性的值
BeginForm(action,controller,method,attributes)上一个方法的重载版本,但能够为form元素的标签属性指定一个对象,该对象的属性作为标签属性的名称
BeginFom(action,controller,routeValues,method,attributtes)上一个方法的重载版本,但能够为应用程序路由配置中的路由片段变量指定一个值,这个值作为一个对象,该对象的属性对应于路由变量。

例如,举例一个最复杂的重载: 

@using (Html.BeginForm(
"CreatePerson",              //动作方法名称
"Home",                      //控制器名称
new { id = "MyIdValue"},     //路由配置中id片段变量的值
FormMethod.Post,             //form元素中method标签属性的值
new { @class = "personClass",data_formType = "person"}  // form元素的其他标签属性
))

指定表单使用的路由 

当使用BeginForm方法时,MVC框架会在能够用来生成指定动作和控制器目标的URL的路由配置中找出一条路由。从本质上说,这是让MVC框架去判断进行的路由选择。如果你希望确保使用一条路由,那么可以替换成BeginRouteForm方法。

假设新增如下路由:

routes.MapRoute(name:"FormRoute",url:"app/forms/{controller}{action}"
);

 BeginRouteForm使用方法如下:

@using(Html.BeginRouteForm(
"FormRoute",          //路由名称
new {},              //用于路由片段变量
FormMethod.Post,      //用于form的method标签属性
new { @class = "personClass",data_formType = "person"}//用于form的其他标签属性
))

 使用输入辅助器

强类型Input HTML 辅助器
HTML元素示例

Check box

(检查框或复选框)

Html.CheckBoxFor(x => x.IsApproved)

output:

<input id = "IsApproved" name = "IsApproved" type = "checkbox" value = "true"/>

<input name = "IsApproved" type = "hidden" value = "false"/>

Hidden field

(隐藏字段)

Html.HiddenFor(x => x.FirstName)

output:

<input id = "FirstName" name = "FirstName" type = "hidden" value = ""/>

Radio button

(无线按钮或单选按钮)

Html.RadioButtonFor(x => x.IsApproved,"val")

output:

<input id = "IsApproved" name = "IsApproved" type = "radio" value = "val"/>

Password

(口令字段)

Html.PasswordFor(x => x.Password)

output:

<input id = "Password" name = "Password" type = "password"/>

Text area

(文本区)

Html.TextAreaFor(x => x.Bio,5,20,new{})

output:

<textarea cols = "20" id = "Bio" name = "Bio" rows = "5">Bio value</textarea>

Text box

(文本框)

Html.TextBoxFor( x => x.FirstName)

output:

<input id = "FirstName" name = "FirstName" type = "text" value = ""/>


使用Select元素 

渲染Select元素的HTML辅助器
HTML元素示例

Drop-down list

(下拉列表)

Html.DropDownList("myList", new SelectList(new [] { "A" ,"B"}), "Choose")

output:

<select id = "myList" name = "myList">

<option value = ""> choose</option>

<option> A </option>

<option> B</option>

</select>

Drop-down list

(下拉列表)

Html.DropDownListFor( x => x.Gender, new SelectList(new [] { "M" ,"F"}), "Choose")

output:

<select id = "Gender" name = "Gender">

<option value = ""> choose</option>

<option> A </option>

<option> B</option>

</select>

Mutiple-select

(多项选择)

Html.ListBox( "myList", new MultiSelectList(new [] { "A" ,"B"}))

output:

<select id = "myList" multiple = "multiple ",name = "myList">

<option value = ""> choose</option>

<option> A </option>

<option> B</option>

</select>

Mutiple-select

(多项选择)

Html.ListBoxFor(  x => Vals, new MultiSelectList(new [] { "A" ,"B"}))

output:

<select id = "Vals" multiple = "multiple ",name = "Vals">

<option value = ""> choose</option>

<option> A </option>

<option> B</option>

</select>

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/548529.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用css3制作旋转加载动画的几种方法

以WebKit为核心的浏览器&#xff0c;例如Safari和Chrome&#xff0c;对html5有着很好的支持&#xff0c;在移动平台中这两个浏览器对应的就是IOS和Android。最近在开发一个移动平台的web app&#xff0c;那么就有机会利用css3去实现一些很酷的效果&#xff0c;这些效果原来更多…

精通ASP.NET MVC ——模型绑定

模型绑定&#xff08;Model Binding&#xff09;是指&#xff0c;用浏览器以Http请求方式发送的数据来创建.Net对象的过程。 准备示例项目 新建一个空的MVC项目&#xff0c;名叫MvcModels&#xff0c;接下去会以此项目来演示各种功能。 在Models文件夹中创建一个Person.cs类…

C# 数据库连接池 线程安全 单例模式 的实现

本文介绍3种线程安全模式 1&#xff0c;lock 2&#xff0c;Mutex 3&#xff0c;MethodImpl 以前写的一个MYSQL数据库连接池ConnectionPool.CS using System; using System.Collections.Generic; using System.Linq; using System.Text;using System.IO; using System.Threading…

精通ASP.NET MVC ——模型验证

文章内容较长&#xff0c;用于记录自己学习。模型验证&#xff08;Model Vaildation&#xff09;是确保应用程序所接受的数据适合于绑定到模型&#xff0c;并且在不合适时给用户提供有用的信息&#xff0c;以帮助他们修正问题的过程。 准备示例项目 新建一个空的MVC项目&…

[wbia 2.2] 对检索结果进行评估

评估对检索系统的性能&#xff1a; 由于我们这里的检索结果&#xff0c;是主要根据PageRank的排名&#xff0c;以及Lucene对文本的分词和相关性计算的最后得分&#xff0c;进行权值调整后得到的排名结果。 这里对我们检索系统的进行性能评估&#xff0c;这里主要评估的是检索结…

错误175:具有固定名称MySql.Data.MySqlClient的ADO.NET提供程序未在计算机或者应用程序配置文件中注册或者无法加载

背景&#xff1a; EF连接MySQL时报错&#xff0c;截图如下图所示&#xff1a; 网上翻阅了很多资料&#xff0c;感觉有一篇文章说的比较靠谱&#xff1a;点击阅读。解决问题的大致过程如下&#xff1a; 在尝试使用MySQL&#xff0c;ADO.NET&#xff08;数据库优先&#xff09;和…

防止刷票方法大全

1. IP限制 这是使用的最多&#xff0c;也是最广泛&#xff0c;不可少的刷票限制。而且由于专题都没有用户模块&#xff0c;使得这个方法&#xff0c;几乎成了唯一可行的手段。该方式&#xff0c;通过获取访问游客的IP地址&#xff0c;来限制其在一段时间内所能使用的票数。当然…

精通ASP.NET MVC ——URL和Ajax辅助器方法

Ajax(或者&#xff0c;如果你愿意&#xff0c;也可以称为AJAX)是 Asynchronous JavaScripts and XML(异步JavaScripts与XML)。其XML部分并不如它往常那样意义重大&#xff0c;但是异步部分却使AJax十分有用。这是后台请求服务器数据&#xff0c;而不必重载Web页面的一种模型。M…

九把巨剑,为什么会从天而降?

在那记忆的残片之中&#xff0c;他看到了九把巨剑从天而降的壮阔画面&#xff0c;还听到了长袍剑客对自己的嘱托。 九把巨剑&#xff0c;为什么会从天而降&#xff1f;这当中&#xff0c;究竟有何寓意&#xff1f; 那个长袍剑客&#xff0c;究竟又是什么人&#xff1f; 没有答案…

精通ASP.NET MVC ——控制器可扩展性

MVC中引导动作方法执行过程的请求流程管道中&#xff0c;有两个重要的部件&#xff1a;控制器工厂(Controller Factory) 和 动作调用器&#xff08;Action Invoker&#xff09;。控制器工厂负责创建对请求进行服务的控制器实例&#xff0c;动作调用器负责查找并调用控制器类中的…

永中向香港博览会主办方演示云办公(转载)

4月16号“香港国际资讯博览会”主办方香港贸发局对永中云办公产品非常感兴趣&#xff0c;由永中员工演示&#xff0c;并拍摄了演示视频。转载于:https://blog.51cto.com/premium/837675

Backbone.js学习笔记

为什么80%的码农都做不了架构师&#xff1f;>>> http://documentcloud.github.com/backbone var todoItem new TodoItem(); todoItem.url /todo; todoItem.fetch(); todoItem.get(description)var TodoItem Backbone.Model.extend({urlRoot: /todos }); var tod…

ASP.NET MVC中使用Autofac实现简单依赖注入

本文参考资料&#xff1a; 1、https://www.cnblogs.com/RayWang/p/11128554.html。 2、https://www.cnblogs.com/eedc/p/6127181.html 3、https://www.cnblogs.com/ancupofcoffee/p/5007649.html#top 前言 关于IoC和DI(依赖注入)的概念网上一搜一大把。简单来说&#xff0c;Io…

初探EntityFramework——来自数据库的EF设计器

本文通过简单的示例&#xff0c;先初步了解下EF四种设计模式之一&#xff1a;来自数据库的EF设计器。 来自数据库的EF设计器&#xff0c;顾名思义&#xff0c;需要有新建的数据库和表结构&#xff0c;才能生成EF设计器&#xff0c; 在本地新建数据库KTStore&#xff0c;并且新建…

【034】◀▶ 学习网站 问题解决

--------------------------------------------------------------------------------------------------------- ●● 目录&#xff1a; A1 ………… ArcGIS Engine 学习网站A2 ………… 其他 ArcGIS Engine 开发网站A3 ………… 程序开发技术博客A4 ………… 问题解决链接 —…

初探EntityFramework——空EF设计器模型

如果没有任何现存数据库架构&#xff0c;可以使用空的EF设计器模型。本文将通过简单示例&#xff0c;了解如何使用空EF设计器模型。 新建空的控制器应用程序EFDesignerDemo&#xff0c;如下图所示&#xff1a; 在项目中右键&#xff0c;选择“添加”&#xff0c;然后是“新建项…

Qt4小技巧——QTextEdit自动滚屏

CuteQt Blog Blog Archive Qt4小技巧——QTextEdit自动滚屏Qt4小技巧——QTextEdit自动滚屏本站所有文章由本站和原作者保留一切权力&#xff0c;仅在保留本版权信息、原文链接、原文作者的情况下允许转载&#xff0c;转载请勿删改原文内容&#xff0c; 并不得用于商业用途。…

初探EntityFramework——来自数据库的Code First

Entity Framkwork从第二版&#xff08;EF4&#xff09;开始&#xff0c;支持新的CodeFirst模式&#xff08;程序代码优先&#xff09;&#xff0c;以自定义类定义数据模型。简化了EF的开发过程。本文章使用简单的示例来说明如何使用来自数据库的CodeFirst模式。 新建一个空的控…

CentOS上安装mysql5.5.23

mysql 5.5版本需要 cmake进行编译安装安装cmake工具需安装基础编译环境 下载安装软件包&#xff1a;mysql-5.5.23.tar.gzhttp://dev.mysql.com/get/Downloads/MySQL-5.5/mysql-5.5.23.tar.gz/from/http://mysql.he.net/cmake-2.8.*.tar.gzhttp://www.cmake.org/files/v2.8/cmak…

初探EntityFramework——空Code First模型

如果不是从现有的系统升级&#xff0c;想要创建全新的项目可以从“空Code First模型开始”。“空CodeFirst模型”要先创建类&#xff0c;Visual Studio会从项目第一次执行的时候根据连接自动创建需要的数据库结构。本文将简单示例说明如何使用“空CodeFirst模型”。 新建控制台…