动作方法参数映射
- 在动作方法中获取URL和表单数据并处理:
public ActionResult Login()
{
string userName = Request.Form["userName"];
string password = Resquest.From["password"];
}
还有没有更方便的获取这些数据的方式?
- 动作方法参数
public ActionResult Detail(int id = 0)
{
//省略代码
}
public ActionResult Login(string userName,string password)
{
//省略代码
}
在这里定义的形式参数,都可以映射表单,路径提交过来的数据。
动作方法映射规则
映射数据来源
- 表单数据:优先级是最高。表单提交的数据,或Request.Form的数据。
- 路由数据:优先级是中,路由数据。或RouteData。Values的数据,主要是路由数据中的占位符。
- URL数据,级别最低,是传输URL数据或Request。QueryString的数据。用到?的形式来传递数值。
动作方法参数要求
- 参数名要和目标数据名称一致
<input name ="userName" type ="text"/>
ActionResult Login(string userName)
数据类型与目标数据数据类型兼容。
- 值类型映射失败情况:
- 传递的数值不是值类型。
- 传递雇来的数据可能为空。
- 非法内容转换成整型/。
这里所讲的数据类型兼容并不是完全就一定是int
也可以是 int? 或者string。
映射数据库来源以及优先级
- 表单数据:优先级是最高。表单提交的数据,或Request.Form的数据。其中post形式提交表单的值是最高的优先级,如果按照ge方式传递数据,优先级低于路由数据。相当于在传递的时候以?拼接的方式传递id,降级为URL数据,而不是表单数据。
- 路由数据:优先级是中,路由数据。或RouteData。Values的数据,主要是路由数据中的占位符。
- URL数据,级别最低,是传输URL数据或Request。QueryString的数据。用到?的形式来传递数值。
动作方法参数映射模型
- 模型映射规则: 模型属性和目标元素名称一致
总结:
动作方法的映射规则
- 参数名称与目标数据名称一致。
- 参数数据类型与目标数据类型兼容。
- 映射模型时模型属性与目标数据名称一致
映射表单优先级
表单>路由> URL
表单验证
- 在ASP.NET中自带了表单验证省去了大量脚本编写
实现步骤
1.定义验证规则->2.应用验证规则->3.显示验证信息。
验证特性
- 支持对模型应用验证规则
- 位于System.CompontentModel.DataAnnotations 命名空间
- 常用的验证特性:
- 特性使用时需要用[]符号括起来。
Requird 必填(非空验证)
Compare 比较验证
StringLength 字符串长度验证
Range 数字(浮点数和整数)、时间等类型的数据范围验证
RegularExpression 正则表达式验证
StringLength
以下实例:
[Stringlength(2000,ErrorMessage="{0}长度不能超过{1}")]
public string Remarks{get;set;}
在使用StringLength验证特性时,会使用占位符在更好的帮助编码人员来提示用户。在占位符中如果出现{0},就表示了这个{0}所在的位置会被所用该特性的属性名或者属性的别名所替代。
范围验证
以下实例:
[Range(10,1000,ErrorMassage="{0}必须在{1}和{2}之间")]
public int?Price{get;set;}//价格
[Range(25.0,150.5,ErrorMessage="{0}必须在{1}和{2}之间")]
public double? Weight{get;set}//体重
[Range(Typeof(DateTime),"2012-1-1","2012-10-1",ErrorMessage="{0}必须在{1}和{2}之间")]
publicDateTime?PublishTime{get;set;}//发布日期
在第三个实例中,第一个参数用Typeof方法设置了比较的类型:DateTime,Typeof方法可以将输入的两个比较的数据自动转化为设置的要比较的类型然后再进行比较。
比较验证
以下实例:
public string Password{get;set;}//密码
[Compare("Password",ErrorMessage="两次输入的密码必须一致")]
public string PassWordConfirm{get;set;}//重复密码
第一个参数是确定使用特性的PassWordConfirm属性和谁去比较。
正则表达式验证
以下实例:
[RegularExpression(@"^\w+((-/w+)|(\.\w+))*\@[A-Za-z0-9+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$",ErrorMessage ="{0}格式错误" )]
public string MailAddress{get;set;}//Email地址
使用DispalyName特性定义属性显示名称
[DisplayName("密码")]
[Required(ErrorMessage="{0}不得为空")]
public string LoginPwd{get;set;}
DisplayName()方法是用来替换{0}占位符,如果设定了DisplayName()方法,那么属性名就被替换为DisplayName()方法中设定的名称,如果没有设定就是属性本名,这个DisplayName()的方法就是起别名。
ModelState 作用
- 验证结果的容器
- 表单数据的容器
模型映射自动应用验证 规则,ModelState 完成初始化。
成员包括:
IsValid 模型上所有验证是否通过。
AddModelError(key,value) 添加验证。
public ActionResult RegisterUser(User user)
{
if(ModelState.IsValid)//验证是否生效
{
UserManager manager = new UserManager();
if(!manager.Register(user))//注册不成功,添加自定义验证信息
{
ModelState.AddModelError("userDouble","用户名已使用,请重新输入!");
return View(user);
}
}v
}
显示验证信息的方法
MvcHtmlStering ValidationMessage(string modelName)//单
MvcHtmlString ValidationSummary();//多
总结
常用验证特性:
- Required 非空验证
- Compare 比较验证
- StringLength 字符串长度
- Range 范围验证
- RegularExpression 正则表达式验证
使用ModelState 对象提示错误信息
- Html.ValidationSummary() 多行
- Html.ValidationMessage() 单行
单行可以控制在什么地方出现,多行的信息是扎堆的。
动作方法特性以及返回值
动作方法特性
- 路由系统不能根据动作方法参数定位动作方法。
动作方法的特性是针对请求类型的,如Get和Post类型。
有以下四种特性:
HttpGet //针对Get 请求
HttpPost//针对Post请求
HttpDelete//针对Delete请求
HttpPut//针对put请求
动作方法返回值类型
NoAction //声明非动作方法
ActionName//为动作方法命名
//在controller中:
public class AccountController:Controller
{
public ActionResult Register()
{}
[ActionName("RegisterUser")]
public ActionResult Register(User user)
{}
}
例如:
AccountController.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using Ch0401.Models;
namespace Ch0401.Controllers
{
public class AccountController : Controller
{
//
// GET: /Account/
public ActionResult Register()
{
return View();
}
[ActionName("RegisterUser")]
public ActionResult Register(User user)
{
if (!ModelState.IsValid)
{
return View("Register",user);
}
else
{
if (user.Name=="zs")
{
ModelState.AddModelError("userDouble", "用户名已存在");
return View("Register", user);
}
return Redirect("~/Home/Index");
}
}
}
}
Register.aspx
<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<dynamic>" %>
<!DOCTYPE html>
<html>
<head runat="server">
<meta name="viewport" content="width=device-width" />
<title>Register</title>
<link href="../../Content/Site.css" rel="stylesheet" />
<style>
table {
width:50%
}
</style>
</head>
<body>
<div>
<form action="/Account/RegisterUser" method="post">
<table>
<tr>
<td>用户名</td>
<td>
<input type="text" name="LoginId" />
</td>
<td>
<%= Html.ValidationMessage("LoginId") %>
<%= Html.ValidationMessage("userDouble") %>
</td>
</tr>
<tr>
<td>真 实 姓 名</td>
<td>
<input type="text" name="Name" />
</td>
<td><%= Html.ValidationMessage("Name") %> </td>
</tr>
<tr>
<td>密 码</td>
<td>
<input type="text" name="Pwd"/>
</td>
<td><%= Html.ValidationMessage("Pwd") %></td>
</tr>
</table>
<input type="submit" name="提交" action="<%= Url.Action("DoRegister") %>" />
</form>
<%= Html.ValidationSummary() %>
</div>
</body>
</html>
User.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
namespace Ch0401.Models
{
public class User
{
[Required(ErrorMessage="用户名不能为空")]
public string LoginId { get; set; }//用户名
[DisplayName("真实姓名")]
[Required(ErrorMessage = "{0}不能为空")]
public string Name { get; set; }//真实姓名
[DisplayName("密码")]
[Required(ErrorMessage="{0}不能为空")]
[StringLength(50,MinimumLength=7,ErrorMessage="{0}长度必须在{2}和{1}之间")]
public string Pwd { get; set; }//密码
}
}
RouteConfig.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
namespace Ch0401
{
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
}
在使用ActionName的方法后,要使用被起别名的这个动作方法只能用别名来访问。
认识ActionResult
ActionResult 和 View() 有什么关系?
view()实际上返回的是 ViewResult, ViewResult 是ViewResultBase,是ActionResult的子类。
ActionResult子类
EmptyResult //输出空内容 没有对应的方法
ContentResult Content(String content) //将指定内容作为文本输出
JsonResult Json(object data)//输出JSON字符串
JavaScriptResult JavaScript(string Script)//输出JavaScript文件
RedirectResult Redirect(string url)//指定的URI 来执行重定向
RedirectToRouteResult RedriectToRoute(String actionName)//指定路由值来只想重定向
FilePathResult File(string fileName,string contentType) //指定晚间路径来输出文件
FileContentResult File(byte[] fileContents,string contentType)//指定字节数组来输出文件
FileStreamResult File(Stream fileStream,striing contentType)//指定流来输出文件
ViewResult view(string ViewName)//调用视图文件输出视图
//其中FilePathResult,FileContentResult,FileStreamResult三种输出类型继承FileResult抽象类
动作方法返回值可以是ActionResult 以外数据类型
例如:
public int Sum(int num1,int num2 )
{
int sum = num1 + num2;
return sum;
}
public void log()
{
File.wirteAllText(@"D:\log.test","保存文件");
}
他们都是动作方法
总结
- 动作方法特性:
HttpGet、HttpPost,
HttpDelete、HttpPut,这两个是请求方式
NonAction、ActionName - 动作方法返回值
ActionResult 类似是动作方法返回值基类
动作方法也返回值也可以是 int、void 类型,该隐式类型都对于ActionResult中的子类。
htmlHelper 辅助工具类
可以按照调用方法的形式来写表单。
掌握HtmlHelper辅助类生成表单方法
有以下几种输出表单的方法:
BeginForm()
Hidden()
Password()
RadioButton()
CheckBox()
TextBox()
TextArea()
DropDownList()
ListBox()
对应的Html:
<form/>
<input type="hidden"/>
<input type="password"/>
<input type="radio"/>
<input type="checkbox"/>
<input type="text"/>
<textarea/>
<select/>
<select multiple="true"/>
使用HtmlHelper生成表单元素的优势
- 避免输错表单元素
- 保持表单数据状态
- 支持验证
实现客户端脚本验证
客户端验证有效的条件
- 强类型视图基类ViewPage(PS:为了支持状态保存)
- 启用验证功能(默认启用)