ASP.NET MVC特性
程序员文章站
2022-07-08 14:38:25
...
ASP.NET MVC的特性
- BindAttribute
限制实体属性,使用BindAttribute
的目的是限制用户在提交Form表单时使用合适且正确的值,当提交表单时,会检查每个实体上绑定的特性。BindAttribute
位于System.Web.Mvc
命名空间下。
// 创建User实体类
[Bind(Exclude="Phone")] //提交User时不提交Phone字段,Phone默认会为null。
public class User
{
public string UserName {get; set;}
public string Email {get; set;}
public string Phone{get; set;}
}
//创建User控制器添加Action
[HttpGet]
public ActionResult Create(){
return View();
}
[HttpPost]
public ActionResult Create([Bind(Exclude="Phone")]User entity){
return View();
}
- RemoteAttribute
远程验证,需要页面使用 jquery.validate.js和jquery.validate.unobtrusive.js。
场景:注册表单中有邮箱,当输入邮箱后要检查是否在数据库已经存在。若存在则不提交表单,可使用RemoteAttribute,通过RemoteAttribute可在进入Action前自动线进行服务端验证。
[Remote(ActionName, ControllerName, ErrorMessage)]
// 实体类
public class User
{
public string UserName{get;set;}
[Remote("CheckEmail", "User", ErrorMessage = "邮箱已存在")]
public strign Email{get;set;}
}
//控制器方法
public JsonResult CheckEmail(string Email)
{
return Json(false, JsonRequestBehavior.AllowGet);
}
// 页面邮箱输入框一旦发生onchange会自动发送异步请求到CheckEmail
@Html.ValidationMessageFor(model=>model.Email, "", new {@class="text-danger"})
- HandleErrorAttribute
根据异常类型直接跳转到相应的错误页面,虽然在ASP.NET MVC处理异常的方式有try...catch
、Filter
、第三方库如elmah
。ASP.NET MVC也提供了一个HandleErrorAttribute
去处理异常。
[HandleError()]
public ActionResult CheckError()
{
return View();
}
//在Web.config中添加
<customErrors mode = "On" defaultRedirect = "Error.cshtml"></customErrors>
//在shared目录下添加视图Error.cshtml
// 根据异常类型的跳转到不同的错误页面
[HandleError(ExceptionType = typeof(DivideByZeroException), View = "DivideByZeroError.cshtml")]
[HandleError(ExceptionType = typeof(NullReferenceException), View = "NullReferenceError.cshtml")]
public ActionResult CheckError()
{
return View();
}
重写该特性进行错误日志记录时,调用方式有两种:
- global 全局注册
- 添加到控制器或动作上
使用HandleErrorAttribute局限
- 不支持Exception记录
- 无法捕捉到500之外的HttpException
- Controller之外抛出的异常无法处理
- AJAX调用出现Exception时会将错误页面内容返回
- HiddenInputAttribute
在Model中直接控制页面输入框显示,若想对用户隐藏一些实体字段,可使用HiddenInput特性。
//实体类
public class User
{
[HiddenInput(DisplayValue=false)]
public string UserName{get;set;}
[Remote("CheckEmail", "User", ErrorMessage="Email is already exists")]
public string Email{get;set;};
}
//视图
@Html.EditorFor(model=>model.UserName, new {})