上一节我们使用原始的HTML表单来完成留言功能,但是ASP.NET MVC提供了丰富的HTML辅助方法来帮助我们构建更简洁优雅的表单。

Step 1. 修改Form标签

首先,我们可以使用Html.BeginForm来创建form标签。这样我们可以将原来的表单改成如下代码。

    @{Html.BeginForm("Save", "Home"); }
<label for="nickname">昵称</label>
<input name="nickname" type="text" />
<br /><br />
<label for="content">内容</label>
<textarea name="content" cols="50" rows="5" ></textarea>
<br /><br />
<input type="submit" value="提交" />
@{Html.EndForm();}

这里使用的Html.BeginForm方法的原型是Html.BeginForm(string actionName,string controllerName)。之前代码<form action="/Home/Save" method="post">中action的值是写死在Html里面的,原本这样做并没有什么问题,可是在ASP.NET MVC中网址Url是可以通过路由规则修改的,写死了对我们后期修改不利,使用这个辅助方法的好处是避免这一点。注意Html.BeginForm和Html.EndForm我们要语句方式调用,所以要加“;”和大括号。当然这样会显得不简洁,所以通常可以使用using语句,如下。

    @using (Html.BeginForm("Save", "Home"))
{
<label for="nickname">昵称</label>
<input name="nickname" type="text" />
<br /><br />
<label for="content">内容</label>
<textarea name="content" cols="50" rows="5" ></textarea>
<br /><br />
<input type="submit" value="提交" />
}

Step 2. 改进表单标签

表单中的label标签和input标签同样可以改用Html辅助方法,来看代码。

    @using (Html.BeginForm("Save", "Home"))
{
@Html.Label("nickname","昵称")
@Html.TextBox("
nickname")
<br /><br />
@Html.Label("content","内容")
@Html.TextArea("content", "",5,50,null)
<br /><br />
<input type="submit" value="提交" />
}

Html.Label和Html.TextBox可以生成之前表单近乎相同的HTML标签。表单标签我们都可以使用Html辅助方法,它们之间的对应关系见下表。

<label> Html.Label
<input type="text"> Html.TextBox
<textarea> Html.TextArea
<select>

Html.DropDownList和Html.ListBox

<input type="hidden"> Html.Hidden
<input type="password> Html.Password
<input type="radio"> Html.RadioButton
<input type="checkbox"> Html.CheckBox

可见Html辅助方法可以让我们使用原本在ASP.NET编程就熟悉的控件名称。

Step 3. 使用强类型视图

在设计Index视图的时候,我们已经了解使用强类型的好处。在Write视图同样也应该使用强类型。

首先在Write视图顶部加上@model MessageBoard.Models.Message,接下来就可以使用强类型辅助方法替换先前的辅助方法。强类型辅助方法名称是辅助方法名加上后缀“For”,如Html.Label的强类型是Html.LabelFor。替换后的代码如下。

@model MessageBoard.Models.Message

@{
Layout = null;
} <!DOCTYPE html> <html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Write</title>
</head>
<body>
<h1>MVC留言板</h1>
@using (Html.BeginForm("Save", "Home"))
{
@Html.LabelFor(m=>m.NickName,"昵称")
@Html.TextBoxFor(m => m.NickName)
<br /><br />
@Html.LabelFor(m => m.Content,"内容")
@Html.TextAreaFor(m => m.Content,5,50,null)
<br /><br />
<input type="submit" value="提交" />
}
</body>
</html>

强类型Html辅助方法使用lambda表达式来代替name字符串,这样做主要有两个好处:一是写代码时可以有代码提示;二是代码重构的时候可以自动修改。所以强类型Html辅助方法是我们主要构建表单的方式。

ASP.NET MVC轻教程 Step By Step 6——改进表单的更多相关文章

  1. 【ASP.NET Web API教程】5.3 发送HTML表单数据:文件上传与多部分MIME

    原文:[ASP.NET Web API教程]5.3 发送HTML表单数据:文件上传与多部分MIME 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本系列教程,请先看前面 ...

  2. 【ASP.NET Web API教程】5.2 发送HTML表单数据:URL编码的表单数据

    原文:[ASP.NET Web API教程]5.2 发送HTML表单数据:URL编码的表单数据 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本系列教程,请先看前面的内 ...

  3. ASP.NET MVC轻教程 Step By Step 1 ——入门

    使用ASP.NET MVC有一段时间了,本人还是非常喜欢ASP.NET MVC这个框架模式的.在经历了WebForm复杂粗暴的做法后,自然感觉简洁优雅的MVC清新可人,只不过WebForm和MVC的设 ...

  4. ASP.NET MVC轻教程 Step By Step 8——路由

    在前面的教程里,细心的你可能会有个疑问,就是地址栏输入/Home/Write就可以进入留言页面.无论是静态HTML还是ASP/ASP.NET.PHP,URL都是和某个页面相关.比如假设有个URL是“w ...

  5. ASP.NET MVC轻教程 Step By Step 13——页面布局

    一般在一个网站中页面会使用相同的结构和元素,如果每个页面都要重复添加这些元素,不仅繁琐更会给我们后期维护带来大麻烦.所以我们采用网页模板之类的技术,将固定不变的元素放入模板,同时留下一些占位符供页面各 ...

  6. ASP.NET MVC轻教程 Step By Step 12——客户端验证

    前面两节使用的两种数据验证方法都是在服务器端进行的,也就是提交了表单,数据回传给服务器才能验证.这样会带来两个问题,一是用户体验不好,用户提交了表单之后才知道存在问题:二是会给服务器带来额外的压力.我 ...

  7. ASP.NET MVC轻教程 Step By Step 9——分页

    现在我们要把Index视图的留言信息进行分页显示. Step 1. 创建路由 我们希望以类似地址http://localhost:41583/Page1来表示第一页,Page2表示第二页,以此类推.在 ...

  8. ASP.NET MVC轻教程 Step By Step 7——改进Write动作方法

    在上一节我们使用强类型视图改进Write视图获得更好的智能感知和代码重构,现在可以进一步的改进动作方法. Step 1. 数据模型绑定 在Save方法中我们使用Request来获取表单传送的值,其实可 ...

  9. ASP.NET MVC轻教程 Step By Step 2 ——View初探

    在上一节我们完成了一个最简化的MVC程序,最重要的是下面这段代码. public class HomeController : Controller { public string Index() { ...

随机推荐

  1. 在C#中如何确定一个文件是不是文本文件,以及如何确定一个文件的类型

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:在C#中如何确定一个文件是不是文本文件,以及如何确定一个文件的类型.

  2. sqlserver 存储过程中拼接sql语句 动态执行

    ALTER PROC [dbo].[Student_Friend_Get] @startRowIndexId INT, @maxNumberRows INT, @schoolId INT, @grad ...

  3. 草稿-Hyper-V

    Hyper-V Over SMB3.0 为Hyper-v宿主机和故障转移群集做防病毒排除 微软SMB 3.0文件共享协议新特性介绍

  4. 50个Android开发技巧(24 处理ListView数据为空的情况)

         在移动平台上为用户展示数据的一个经常用法是将数据填充进一个List内,而此时须要注意的一点就是: 原文地址:(http://blog.csdn.net/vector_yi/article/d ...

  5. Gstreamer 数据流线程(GstTask / GstTaskPool)分析

    作者:fengcc 原创文章 转载请注明出处 GStreamer 是一个基于流水线的多媒体框架,基于 GObject,以 C 语言写成. 凭借 GStreamer,程序员可以很容易地创建各种多媒体功能 ...

  6. 【转】正确使用Block避免Cycle Retain和Crash

    原文地址:http://tanqisen.github.io/blog/2013/04/19/gcd-block-cycle-retain/ 使用指南:http://blog.csdn.net/nic ...

  7. linux中的网络通信指令 分类: 学习笔记 linux ubuntu 2015-07-06 16:02 134人阅读 评论(0) 收藏

    1.write write命令通信是一对一的通信,即两个人之间的通信,如上图. 效果图 用法:write <用户名> 2.wall wall指令可将信息发送给每位同意接收公众信息的终端机用 ...

  8. 获取DLL的文件路径以及调用DLL的文件路径

    如何在DLL中,获取DLL本身的路径以及调用DLL的文件的路径呢?主要通过GetModuleFileName(HMODULEhModule,LPTSTR lpFilename,DWORD nSize) ...

  9. GitHub详细教程

    GitHub详细教程 Table of Contents 1 Git详细教程 1.1 Git简介 1.1.1 Git是何方神圣? 1.1.2 重要的术语 1.1.3 索引 1.2 Git安装 1.3 ...

  10. TCP/IP 协议理解

    TCP/IP 协议(Transmission Control Protocol / internet Protocol),因特网互联协议,又名网络通讯协议.通俗而言:TCP负责发现传输的问题,一有问题 ...