使用html5辅助方法和使用强型别辅助方法的区别

1218被浏览215932分享邀请回答10014 条评论分享收藏感谢收起12214 条评论分享收藏感谢收起查看更多回答ASP.NET MVC5(三):表单和HTML辅助方法
时间: 22:52:22
&&&& 阅读:74
&&&& 评论:
&&&& 收藏:0
标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&表单的使用
Action和Method特性
  Action特性用以告知浏览器信息发往何处,因此,Action特性后面需要包含一个Url地址。这里的Url地址可以是相对的,也可以是绝对的。如下Form标签向Bing的search页面发送一个搜索词(输入元素的名称为q)。
&form action="/search"&
&input name="q" type="text" /&
&input type="submit" value="search" /&
  Method特性可以告知浏览器使用HTTP POST还是使用HTTP GET,默认情况下表单发送的是HTTP GET请求。下面,我们分别介绍GET方法和POST方法。
GET方法 - 从指定的资源请求数据
GET请求可被缓存
GET请求保留在浏览器历史记录中
GET请求可被收藏为书签
GET请求不应在处理敏感数据时使用
GET请求有长度限制
GET请求只应当用于取回数据
POST方法 - 向指定的资源提交要被处理的数据
POST请求不会被缓存
POST请求不会保留在浏览器历史记录中
POST不能被收藏为书签
POST请求对数据长度没有要求
以下是对HTTP GET和HTTP POST的比较:
区别项GETPOST
后退按钮/刷新
数据会被重新提交(浏览器应该告诉用户数据会被重新提交)
可收藏为书签
不可收藏为书签
application/x-www-form-urlencoded
application/x-www-form-urlencoded或multipart/form-data。为二进制数据使用多重编码
参数保留在浏览器历史中
参数不会保存在浏览器历史中
对数据长度的限制
限制,当发送数据时,GET方法想URL添加数据;URL的长度是受限制的(最长2048个字符)
对数据类型的限制
只允许ASCII字符
没有限制,也允许二进制数据
于 POST相比,GET安全性较差,因为数据时暴露在URL当中的
更安全,因为参数不会被保存在浏览器历史或Web服务器日志当中
在URL中对所有人可见
数据不会显示在URL当中
表单的使用
下面,我们使用表单来构建一个查询产品的示例:向上一篇模型一节中的示例添加5种产品
修改ProductsController,添加Search和Result方法:
public ActionResult Search()
return View();
public ActionResult Result(string productName)
var products = db.Products.Where(a =& a.ProductName == productName);
return View(products);
并添加相应的视图,代码如下
Search.cshtml(空模板):注意:这里我们使用了Form表单
ViewBag.Title = "Search";
&h2&Search&/h2&
@using (Html.BeginForm("Result", "Products", FormMethod.Get))
&input type="text" name="productName" class="form-control" /&
&input type="submit" value="search" class="btn btn-default" /&
Result.cshtml(List模板):
@model IEnumerable&MyFirstMvcProject.Models.Product&
ViewBag.Title = "Result";
&h2&Result&/h2&
@Html.ActionLink("Create New", "Create")
&table class="table"&
@Html.DisplayNameFor(model =& model.ProductName)
@Html.DisplayNameFor(model =& model.Description)
@Html.DisplayNameFor(model =& model.Price)
@foreach (var item in Model) {
@Html.DisplayFor(modelItem =& item.ProductName)
@Html.DisplayFor(modelItem =& item.Description)
@Html.DisplayFor(modelItem =& item.Price)
@Html.ActionLink("Edit", "Edit", new { id=item.Id }) |
@Html.ActionLink("Details", "Details", new { id=item.Id }) |
@Html.ActionLink("Delete", "Delete", new { id=item.Id })
启动项目,将URL定位到/Products/Search,效果如下:
在文本框中输入MateBookX,点击search按钮,得到查询结果。
通过以上示例,我们已经成功的使用表单实现了一个产品查询的功能。
HTML辅助方法
  上一节中,已经涉及到Html.BeginForm辅助方法的使用,使用辅助方法的目的很明确,就是使视图编码变得更容易。
辅助方法简介
  每一个Razor视图都继承了它们基类的Html属性,Html属性的类型是System.Web.Mvc.HtmlHelper&T&,这里的T是一个泛型类型的参数,代表传递给视图的模型类型。这个属性提供了一些实例方法,然而,如BeginForm等大多数辅助方法都是通过扩展方法实现的,ASP.NET MVC所有的HtmlHelper扩展方法都在命名空间System.Web.Mvc.Html中。
在智能感知窗口中,左边有个向下箭头就说明这个方法是一个扩展方法。
下面,我们将介绍一些常用的辅助方法:
Html.TextBoxTextBox辅助方法渲染一个type特性为text的input标签。调用方法:@Html.TextBox("Title","This is Value")生成HTML标记:&input id="Title" name="Title" type="text" value="This is Value" /&
Html.TextAreaTextArea渲染一个能够显示多行文本的&textarea&元素。调用方法:@Html.TextArea("text","Hello ! This is Text Area !")生成HTML标记:&textarea cols="20" id="text" name="text" rows="2"& Hello ! This is Text Area !&/textarea&
Html.LabelLabel辅助方法返回一个&label/&元素,并使用String类型的参数来决定渲染的文本。调用方法:@Html.Label("Name")生成HTML标记:&label for="Name"&Name&/label&Name
Html.DropDownList和Html.ListBoxDropDownList和ListBox辅助方法都返回一个&select/&元素。DropDownList允许进行单项选择,而ListBox支持多项选择。修改ProductsController中的Search方法
public ActionResult Search()
var products = db.Products.Single(a =& a.ProductName == "Apple Pencil");
ViewBag.Products = new SelectList(db.Products.OrderBy(g =& g.Price), "Id", "ProductName", products.Id);
return View();
并在相应的View中添加辅助方法DropDownList,效果如下:
@Html.DropDownList("Products", String.Empty)
Html.ValidationMessage当ModelState字典中的某一特定字段出现错误时,可以使用ValidationMessage辅助方法来显示相应的错误提示信息。修改ProductsController中的Search方法
public ActionResult Search()
var products = db.Products.Single(a =& a.ProductName == "Apple Pencil");
ViewBag.Products = new SelectList(db.Products.OrderBy(g =& g.Price), "Id", "ProductName", products.Id);
ModelState.AddModelError("Title", "Support domestic products!");
return View();
在相应的视图中添加下面这行代码显示错误提示信息,效果如下:
@Html.ValidationMessage("Title")
强类型辅助方法
  如果不习惯使用字符串字面值从视图数据中提取值的话,可以使用ASP.NET MVC提供的各种强类型辅助方法。使用强类型辅助方法,只需要为其传递一个lambda表达式来指定要渲染的模型属性。我们以上一节中的DropDownList为示例,修改View中的代码,首先,在视图顶部输入如下所示的代码:
@model MyFirstMvcProject.Models.Product
使用下面的代码重写DropDownList:
@Html.DropDownListFor(m =& m.Id, ViewBag.Products as SelectList)
效果如下:
注意,强类型的辅助方法名称除了有For后缀外,与先前介绍的辅助方法名相同。使用强类型辅助方法的优点是能够获取智能感知以及编译时检查。
渲染辅助方法
  渲染辅助方法可以在应用程序中生成指向其他资源的链接,也可以构建被称为部分视图的可重用UI片段。
Html.ActionLink和Html.RouteLinkActionLink辅助方法能够渲染一个超链接,指向另一个控制器。如下是Products/Details视图中的一段示例,如果没有指定控制器,就返回当前视图对应的控制器:
@Html.ActionLink("Back to List", "Index")
RouteLink辅助方法只可以接受路由名称,而不能接受控制器名称和操作名称。
@Html.RouteLink("Back to List", new { Action = "Index"})
Url.Action、Url.RouteUrl和Url.ContentURL辅助方法与HTML的ActionLink和RouteLink辅助方法相似,但它不以HTML标记的形式返回构建的URL,而是以字符串的形式返回这些URL。RouteUrl辅助方法与RouteLink一样,只接受路由名称,而不接受控制器名称和操作名称。Content辅助方法可以把应用程序的相对路径转换成绝对路径。
Html.Partial和Html.RenderPartialPartial和RenderPartial都是渲染一个部分视图,都不使用Controller,Partial回传一个MvcHtmlString,所以可以把结果保存在变量之中,RenderPartial没有返回值,直接写入响应输出流当中。
@Html.Partial("PartialViewName")
@{ Html.RenderPartial("PartialViewName"); }
Html.Action和Html.RenderActionAction和RenderAction类似于Partial和RenderPartial,但这两个方法都用到Controller之后再回传一个页面,可以在Controller方法上添加ChildActionOnly特性,防止页面直接被浏览。
标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&国之画&&&& &&&&chrome插件&&
版权所有 京ICP备号-2
迷上了代码!让汽车运行基于HTML5的应用-仪器仪表电路图-电子产品世界
-&-&-&让汽车运行基于HTML5的应用
让汽车运行基于HTML5的应用
汽车系统与外部世界的交互越来越多,比如与智能手机和云端的交互,因此迫切需要理解应用是如何开发的、它们的可持续性以及用HTML5开发应用与用传统开发方法开发应用之间的区别。管理HTML5与汽车信息娱乐系统之间的交互要求采用技术上先进的方法才能获得最佳结果,特别是最新HTML5集成面临着很大的复杂性和支持挑战。
将HTML5集成进汽车系统所面临的挑战
第三方开发人员操控汽车空间时面临着很多困难。可以肯定地说,汽车系统的安全保障是创建车载应用时考虑的最重要因素,因为任何类型的性能妥协都会增加用户的危险。应用开发人员开发的应用在汽车行驶过程中必须限制使用,并且不能中断汽车系统的正常运行。只有专门配置的应用才能访问汽车的信息。
除了安全性外,还有其它技术性挑战需要考虑。首先也是最重要的是,汽车系统中使用的技术必须在汽车整个生命期内保持其适用性,并能得到良好的维护。汽车生命期平均为10年左右,不像智能手机只有大约2至3年的生命期。随着新产品的不断开发,汽车技术也需要能够不断支持最新的技术标准。
另外还存在着确保汽车中使用方便的挑战。如果汽车有多个屏幕(如抬头单元、仪表群显示器、高镶嵌式显示器等),所有应用必须能够同时运行,并能够与全部屏幕进行交互。此外,消费者期望他们的车载汽车应用能够像他们的智能手机应用那样,具有丰富的用户界面、简单的命令和输入以及复杂的动画效果。
在汽车系统中使用HTML5的好处
HTML5应用的最大特点之一是,它们容易开发,适合在各种移动设备上运行。与汽车系统的集成尤其重要,因为它们有基于自身特殊技术的要求。今天的市场上已经充斥着大量与汽车系统有关的HTML5应用(想想大量的音乐和GPS应用吧),而且随着无数开发人员熟悉并使用HTML5开展工作,未来基于HTML5的汽车应用只会越来越多。
HTML5还配备有必要的基础架构用于汽车应用开发。附加的好处是通过CSS(用于建立网页的另外一种关键技术)很容易改变应用的风格,从而使得这种自适应过程能够完美匹配多种平台和云端技术。
创建HTML5解决方案的七个步骤
为了成功创建HTML5解决方案,开发人员应该遵循以下几个高层次的步骤:
创建浏览器——这是七个步骤中第一个也是最先进的步骤,因为它涉及许可或自己创建一个浏览器并将它与目标平台整合在一起。通常会集成和优化一些硬件与输入方法,同时剔除不必要的组件,并进行性能加速。可以利用有限的一些浏览器供应商,如Dolphin、Obigo、Access Systems、ZetaKey.与第三方网络浏览器提供商合作的关键优势是,能够在汽车整个生命期内开发和维护解决方案。另外一种方法是在Webkit浏览器基础上开发自己的解决方案。Webkit浏览器可以是基于QT发行版,也可以从网络获得最新版本。还可以用更快的Javascript引擎(如谷歌的V8)进一步优化Webkit浏览器。最后一种方法是使用另外一种得到良好维护的开源浏览器,如基于谷歌的Chromium.
固有集成——浏览器可以进一步集成一些固有组件。极具挑战性的用户界面任务可以利用浏览器插件或运行独立的进程用固有组件完成,这些组件将通过HTML/Socket服务器与HTML应用进行交互。这些组件例子包括媒体播放器、导航/地图映射、免提电话整合等。对这种功能的访问可以通过特定API提供给第三方应用。
创建仿真环境——为了向第三方开发人员提供创建与测试他们应用的能力,必须为每种台式机操作系统(Windows,Mac及可能的Linux)提供仿真环境。仿真环境应直接反映目标平台浏览器环境、通过用户界面仿真硬件按钮、能够安装和删除应用,并提供控制台输出和网络应用调试能力。
硬件按钮的整合——在汽车系统中通常存在许多种控制方式,比如触摸屏、方向盘按钮、旋钮等,它们必须被整合进同一平台。这些控制一般不推荐使用专门的API,要开发成标准导航控制(如用作改变活动焦点的tab控制的旋钮)。然而,这些控制可以呈现扩展的JavaScript API,允许特定应用以不同方式使用它们。浏览器可以检查活动单元是否有注册过的句柄用于专门的控制,如果有,则使用它的函数。如果没有注册过的句柄,浏览器可以求助于标准行为。
应用JavaScript架构——运行第三方应用的能力是基于HTML5的汽车系统的主要要求和优点之一。系统必须提供一个能够下载、执行应用并且应用间能流畅通信的平台。下面的JavaScript部分提出并详细介绍了一种可能的架构。
私有软件开发套件——诸如访问汽车信息、GPS、诊断信息、驾驶状态等附加功能在当今汽车系统中很常见。为了提供更好的整合经验,系统也可以提供私有软件开发套件(SDK),以便允许第三方应用相互间的通信。这可以通过应用能够方便链接和使用的JavaScript API实现。建议将标准JavaScript API用于标准功能,如定位API(GPS),因为它允许应用具有更好的可移植性,并且更容易开发。
多屏整合——汽车环境中的应用可以在多个屏幕上操作,比如主应用运行的中央栈显示器以及诸如显示附加信息(如互联网收音机、下一个拐弯指令等)的仪表盘等其它显示器。下面介绍和描述了一种可能的多屏架构。
应用JavaScript架构例子
在使用JavaScript架构时,可以通过标准HTML方法将HTML5实现为基本的用户界面框架。一些抽象元素是通过JavaScript库创建的,独立的JavaScript组件和应用则用于模块化方法。针对更为复杂的用户界面元素,可以用固有组件扩展浏览器。为了更加方便地进行开发和应用维护,模块之间需要保持独立。jQuery之所以被用作基本用户界面框架是因为可以得到第三方用户界面小插件。用户界面框架也可以作为jQuery的扩展。
应用的生命期和窗口管理是通过应用管理框架(AMF)进行的,并且这些应用通过div元素(用于通用组织型或格式化应用)和iframe元素(内联浮动帧)独立运行。应用连接库(ACL)是应用程序与应用框架管理这些独立模块之间的通信桥梁,应用管理框架和应用连接库都使用JavaScript.
扩展JS库是一个可选功能。鉴于所有事情使用纯JS/HTML都能正确完成,因此这个功能是不必要的。它的作用是将固有的插件功能展示为JavaScript.
一个多屏架构例子
如下图所示,汽车系统可以使用高镶嵌式显示器(HMD)、仪表盘显示器(ICD)或中央栈显示器(CSD)运行多个应用。这些应用通过AppHost(Qt)与系统内部消息模块(ISM)进行通信。ISM允许应用广播消息或注册消息收听者。AppHost将消息广播到其它主机,随即被翻译成JavaScript,并广播回ISM.屏幕之间的动画或其它用户界面同步也可以使用这种机制。
HTML5的好处远胜过挑战
即使成功创建HTML5系统的主要挑战是搭建和维护一个最优化的浏览器,但专门为汽车系统这样做将允许汽车在整个生命期内保持不落伍。然而,还必须考虑到其它一些重要的汽车特殊因素,包括特殊的汽车人机界面和多屏系统。
上述高层架构提供了一种解决其中一些特殊汽车难题的有效方法,有效激发了HTML5在汽车领域中大规模应用的潜能。
分享给小伙伴们:
阅读:11404
阅读:17310
阅读:14483
阅读:19800
阅读:14525
微信公众号二
微信公众号一2048人阅读
ASP.NET MVC(15)
在ASP.NET MVC中,Html辅助方法给我们程序员带来很多方便,其重要性也就不言自明。有时候,我们不想重复地写一些HTML代码,或者MS没有提供我们想要的那个HTML标签的Html辅助方法,那么,我们就可以通过自己定义一个Html扩展方法来达到这个目的。
比如,到目前为止,Html扩展方法中没有关于&input type=&file& /&这类标签的辅助方法,那么我们就可以自已实现一个。本文以实现&input type=&file& /&标签为例,演示如何实现自定义Html扩展方法。
一、实现自定义弱类型Html扩展方法
其实实现自定义Html扩展方法并不难,有兴趣的同学可以去看下MVC源代码,关于Html扩展方法部分。要用到System.Web.Mvc命名空间下的TagBuilder类,MvcHtmlString类。TagBuilder类为Html辅助方法生成HTML标签,MvcHtmlString代表HTML编码的字符串。扩展方法代码如下所示:
public static class MyInputExtensions
& & public static MvcHtmlString Input(this HtmlHelper htmlHelper, string name)
& & & & TagBuilder tagBuilder = new TagBuilder(&input&);//设置标签类型为input
& & & & tagBuilder.Attributes.Add(&type&, &file&);//为标签添加type属性及值
& & & & tagBuilder.Attributes.Add(&name&, name);//为标签添加name属性及值
& & & & tagBuilder.GenerateId(name);//为标签生成Id,name参数代码Id的值
& & & & //创建经过HTML加密的字符串
& & & & //TagRenderMode.SelfClosing枚举值代表当前标签是自动关闭的
& & & & return MvcHtmlString.Create(tagBuilder.ToString(TagRenderMode.SelfClosing));
需要特别提醒的是,扩展方法类所在的命名空间最好设置为System.Web.Mvc,这样,我们在View中可以通过智能感知轻易找到,也不容易出错或者无法通过VS智能感知找到我们自定义的Html辅助方法,可以为我们省去很多不必要的麻烦。将上面代码编译,我们即可在View中通过智能感知看到我们自定义的Html辅助方法。如下图所示:
使用方法和其它Html辅助方法一样,如下代码所示:
& & &&&%: Html.Input(&Path&) %& //字符串参数Path代表生成标签的name属性和id属性的值&
需要说明的是,本例所示是为了生成&input type=&file&&标签,是不用设置值的,读者可以通过自身情况定义扩展方法。然后运行,通过浏览器查看HTML源代码,如下图所示:
二、实现自定义强类型Html辅助方法
强类型辅助方法的一个好处是,我们可以通过编译器为我们检测一些错误,为我们节省一些排错的时间与精力。所以,强类型Html辅助方法是不可缺少的。代码如下:
&public static class MyInputExtensions
& & &public static MvcHtmlString Input&TModel, TValue&(this HtmlHelper&TModel& htmlHelper, Expression&Func&TModel, TValue&& expression)
& & & & &string modelName = ExpressionHelper.GetExpressionText(expression);//从Lambda表达式中获取模型对应属性的名称
& & & & & TagBuilder tagBuilder = new TagBuilder(&input&);//设置标签类型为input
& & & & &tagBuilder.Attributes.Add(&type&, &file&);//为标签添加type属性及值
& & & & & tagBuilder.Attributes.Add(&name&, modelName);//为标签添加name属性及值
& & & & & tagBuilder.GenerateId(modelName);//为标签生成Id,name参数代码Id的值
& & & & & //创建经过HTML加密的字符串
& & & & & //TagRenderMode.SelfClosing枚举值代表当前标签是自动关闭的
& & & & &return MvcHtmlString.Create(tagBuilder.ToString(TagRenderMode.SelfClosing));
然后我们编译,在View中,我们就可以通过智能感知看到我们新扩展的强类型Html辅助方法了。如下图所示:
我们可以通过如下代码使用新扩展的Html辅助方法:
& & &&&&%: Html.Input(model
=& model.Path) %&//Path代表model的Path属性,生成标签的name和id的属性值均会是Path
运行,我们通过浏览器查看生成的Html源代码如下图所示:
三、为标签错误输入添加CSS支持
对于要求输入的标签,如Text,如果用户输入错误内容,我们可以为当前标签添加CSS错误提示,为用户提供一个更加友好、人性化的界面。代码如下所示:
ModelState modelS
if (htmlHelper.ViewData.ModelState.TryGetValue(name, out modelState))
& & if (modelState.Errors.Count & 0)
& & & & //添加错误提示CSS
& & & & &tagBuilder.AddCssClass(HtmlHelper.ValidationInputCssClassName);
&将以上代码复制到我们自定义的扩展方法的返回MvcHtmlString字符串之前即可。
本文通过演示如果实现自定义&input type=&file& /&标签的Html辅助方法,展示了如何在ASP.NET MVC中实现自定义Html辅助方法。对于ASP.NET MVC程序员来说,这是非常实用的。
一个完整的扩展示例方法:
& & & &&public
static MvcHtmlString InputText&TModel, TValue&(this HtmlHelper&TModel& html,
& & & & & & Expression&Func&TModel, TValue&& expression, IDictionary&string, object& htmlAttributes)
& & & & { &
& & & & & & TagBuilder tagBuilder = new TagBuilder(&input&);
& & & & & & var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
& & & & & &
//第1步:获取模型字段的显示文本
& & & & & & string text = metadata.DisplayName ?? metadata.PropertyN
& & & & & &
//第2步:获取模型字段的字段名
& & & & & & var name = ExpressionHelper.GetExpressionText(expression);
& & & & & &
//第3步:获取模型字段的值
& & & & & & #region 模型字段的值
& & & & & &
& & & & & & ModelState modelS
& & & & & & string fullName = html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name);
& & & & & & if (html.ViewData.ModelState.TryGetValue(fullName, out modelState) && modelState.Errors.Count &
& & & & & & {
& & & & & & & & tagBuilder.AddCssClass(HtmlHelper.ValidationInputCssClassName);
& & & & & & }
& & & & & & if (modelState != null && modelState.Value != null)
& & & & & & {
& & & & & & & & value = modelState.Value.AttemptedV
& & & & & & }
& & & & & & else if (metadata.Model != null)
& & & & & & {
& & & & & & & & value = metadata.Model.ToString();
& & & & & & }
& & & & & & else
& & & & & & {
& & & & & & & & value = String.E
& & & & & & }
& & & & & & #endregion&
& & & & & & tagBuilder.Attributes.Add(&type&, &text&);
& & & & & & tagBuilder.Attributes.Add(&name&, name);
& & & & & & tagBuilder.Attributes.Add(&value&, value);
& & & & & &
//第4步:填充其他自定义属性
& & & & & & tagBuilder.MergeAttributes(htmlAttributes, true);
& & & & & & tagBuilder.GenerateId(name);
& & & & & & return MvcHtmlString.Create(tagBuilder.ToString(TagRenderMode.SelfClosing));
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2185746次
积分:21841
积分:21841
排名:第377名
原创:414篇
转载:129篇
译文:21篇
评论:267条
(1)(18)(5)(1)(1)(4)(1)(2)(2)(2)(2)(2)(3)(3)(1)(4)(3)(6)(2)(2)(3)(8)(2)(7)(7)(2)(3)(2)(4)(3)(3)(8)(2)(3)(2)(5)(1)(3)(12)(6)(4)(11)(6)(1)(3)(3)(5)(3)(3)(8)(13)(23)(8)(6)(5)(15)(6)(4)(1)(6)(22)(6)(10)(2)(5)(12)(5)(12)(3)(5)(3)(2)(16)(7)(7)(4)(1)(5)(6)(7)(7)(4)(3)(10)(14)(7)(1)(2)(6)(18)(2)(27)(35)(1)(2)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'

我要回帖

更多关于 html 的文章

 

随机推荐