精通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,一经查实,立即删除!

相关文章

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

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

精通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;和…

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

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

精通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;并且新建…

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

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

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

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

初探EntityFramework——空Code First模型

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

初探EntityFramework——实体类结构映射

实体类与数据表的映射有一套专用的规则。Code First 采用的惯例优于预先设置的设计&#xff0c;在没有任何设置的情况下&#xff0c;自动检测模型结构并推导出默认设置以简化类的设计&#xff0c;因此不需要特别设置类的属性即可完成模型设计。 例如&#xff0c;当DbContext的模…

深入了解EntityFramework——数据注解属性

当惯例规则不符合设计需求时&#xff0c;我们可以使用数据注解配置打造更合适的数据库模型。本文根据示例项目对常用的数据注解属性做一个简要的举例说明。 EFCodeFirst使用的约定大于配置的的编程模式&#xff0c; 这种模式利用默认约定根据我们的领域模型建立概念模型。然我们…

Android上实现柱状图表

Android上实现柱状图算法实现 第一步&#xff1a; 获取Android设备的屏幕大小 第二步&#xff1a; 在View对象中使用Canvas绘制蓝色边框与白色背景XY轴两条线&#xff0c;代码如下 第三步&#xff1a; 绘制柱状图标题 第四步&#xff1a; 根据数据集计算出每个系列数据所占X轴的…

深入了解EntityFramework——Fluent API

Fluent API 除了惯例原则与属性数据注解外&#xff0c;FluentAPI是另一种支持实体类配置设置的方式。与属性数据注解相比&#xff0c;它提供了更广泛的功能与设置弹性。实体类若同时设置了数据注解&#xff0c;则采用的优先权是“Fluent API” > "数据注解" &g…

深入了解EntityFramework——Lazy Loading与Eager Loading

Lazy Loading&#xff1a;延迟加载。Eager Loading&#xff1a;贪婪加载。 首先通过一个简单的控制台应用程序例子说明延迟加载&#xff1a; 订单主表和订单从表&#xff0c;并且订单主表和订单从表是一对多的关系&#xff0c;代码如下图所示&#xff1a; //订单主表public cl…

SQL – 2.SQLServer的管理 + 3.SQL基础1 + 4.SQL基础2

SQLServer的管理 常用字段类型&#xff1a;bit(可选值0、1)、datetime、int、varchar、nvarchar&#xff08;可能含有中文用nvarchar&#xff09;varchar、nvarchar 和char(n)的区别&#xff1a; char(n)不足长度n的部分用空格填充。Var&#xff1a;Variable&#xff0c;可变的…

EntityFramework进阶——继承

通过类型继承&#xff0c;我们可以更弹性地处理数据&#xff0c;有3中相关的技巧&#xff0c;即TPH&#xff0c;TPT&#xff0c;TPC。 Table Per Hierarchy&#xff08;TPH&#xff09; 当单个数据表存储不同数据类型时&#xff0c;在数据模型的设计上&#xff0c;可以使用Tab…