软件下载 | 资讯教程 | 最近更新 | 下载排行 | 一键转帖 | 发布投稿
您的位置:最火下载站 > 网络编程 > ASP.NET > ASP.NET MVC 1.0 - 9. ModelBinder

ASP.NET MVC 1.0 - 9. ModelBinder

  烈火网(Liehuo.Net)教程 在 MVC 项目中,Model 通常指 Entity Class。只是默认情况下 Action 的参数与 MapRoute 定义的规则一致,都是些松散的简单类型,我们必须手工将这些参数赋值给 Model 对象属性。很显然,这些代码很无聊也很无趣(如果贵公司按代码行数发奖金,那么请直接跳过本文),所幸 MVC 为我们这些懒人提供了一个自动化的操作。

  看下面的演示:

 

public class MvcApplication : System.Web.HttpApplication
{
public static void RegisterRoutes(RouteCollection routes)
{
...

routes.MapRoute(
"Test",
"Test/{name}/{age}",
new { controller = "Test", action = "Index", name = "", age = 0 }
);

...
}
}

public class TestController : Controller
{
public ActionResult Index(User user)
{
ViewData.Model = user;
return View();
}
}

public class User
{
public string Name { get; set; }
public int Age { get; set; }
}

  当我们请求 "/Test/Tom/23" 时,我们发现 Index() 的 user 参数的属性被正确赋值。很智能很傻瓜,不是吗?这一切是如何发生的呢?

 

public class ControllerActionInvoker : IActionInvoker
{
protected virtual object GetParameterValue(controllerContext, parameterDescriptor)
{
...
IModelBinder binder = GetModelBinder(parameterDescriptor);
...
ModelBindingContext bindingContext = new ModelBindingContext()
{
FallbackToEmptyPrefix = (parameterDescriptor.BindingInfo.Prefix == null),
ModelName = parameterName,
ModelState = controllerContext.Controller.ViewData.ModelState,
ModelType = parameterType,
PropertyFilter = propertyFilter,
ValueProvider = valueProvider
};

object result = binder.BindModel(controllerContext, bindingContext);
return result;
}
}

  哦,魔法源自 IModelBinder binder,它的默认真身是 DefaultModelBinder。

  public class DefaultModelBinder : IModelBinder
{
public virtual object BindModel(controllerContext, ModelBindingContext bindingContext)
{
...
return BindComplexModel(controllerContext, bindingContext);
}
}

  DefaultModelBinder 内部通过大量的反射完成最终的赋值操作,基本上能适应我们日常开发所需。有兴趣的可以自己去看实现细节,本文不作赘述。

  有必要说明的是 ModelBindingContext,它包含了 BindModel 操作所需的全部信息,包括类型(ModelType)、属性过滤(propertyFilter)、操作状态(ModelState),以及相应的请求值(valueProvider)等。

相关阅读
网友评论
栏目导航
推荐软件