欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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...catchFilter、第三方库如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();
}

重写该特性进行错误日志记录时,调用方式有两种:

  1. global 全局注册
  2. 添加到控制器或动作上

使用HandleErrorAttribute局限

  1. 不支持Exception记录
  2. 无法捕捉到500之外的HttpException
  3. Controller之外抛出的异常无法处理
  4. 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 {})