在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
什么是ModelBindingASP.NET MVC中,所有的请求最终都会到达某个Controller中的某个Action并由该Action负责具体的处理和响应。为了能够正确处理请求,Action的参数(如果有的话),必须在Action执行之前,根据相应的规则,把请求中所包含的数据提取出来并将映射为Action的参数值,这个过程就是ModelBinding。ModelBinding的作用就是为Action提供参数列表。 ModelBinding的好处
ASP.NET MVC中ModelBinding的实现过程ASP.NET MVC中ModelBinding的实现过程比较复杂,这里简要说明它的总体流程。具体的实现过程可以看蒋金楠的《ASP.NET MVC5框架揭秘》或者看他的博客How ASP.NET MVC Works?,讲解很详细。
自定义ModelBinder自定义Modelbinder只需实现 public class LessonEditInfoViewModelBinder : IModelBinder { //根据前台传递的id值获取对象 public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { var idStr = controllerContext.HttpContext.Request["id"] ?? controllerContext.RouteData.Values["id"]?.ToString(); int id = 0; if (!int.TryParse(idStr, out id)) { return null; } var model = new LessonBLL().GetLessonEditInfo(id); return model; } } 然后使用 /* 根据前台传递的id值解析出对象数据,Action无需关注对象的获取,使代码变得清晰简洁 */ public ActionResult Edit([ModelBinder(typeof(LessonEditInfoViewModelBinder))]LessonEditInfoViewModel lesson) { if (lesson == null) { //跨控制器的视图跳转要使用视图的路径+文件名 return View("/Views/Exception/GenericError.cshtml", new ExceptionViewModel { Title = "404", Description = "课程不存在!" }); } return View(lesson); } 如果项目中多处需要使用自定义的ModelBinder,那么再使用 public class CustomeModelBinderProvider : IModelBinderProvider { public IModelBinder GetBinder(Type modelType) { if (modelType == typeof(LessonEditInfoViewModel)) { return new LessonEditInfoViewModelBinder(); } return null; } } 然后将自定义的ModelBinderProvider注册到ASP.NET MVC系统中 public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { ModelBinderProviders.BinderProviders.Insert(0, new CustomeModelBinderProvider()); } } 完成上述两步之后,就无需使用 除此之外,还可在Global文件中使用使用 ModelBinders.Binders.Add(typeof(LessonEditInfoViewModel),new LessonEditInfoViewModelBinder()); 不同的ModelBinder提供策略有不同的优先级,具体如下:
注意,CustomModelBinderAttribute是抽象类,在ASP.NET MVC中有唯一子类ModelBinderAttribute。 参考文章:Model Binders in ASP.NET MVC |
请发表评论