В моем решении MVC 3 я хочу, чтобы все идентификаторы в строке запроса были зашифрованы.Чтобы расшифровать URL-адреса, которые я унаследовал от DefaultModelBinder и переопределил метод BindProperty:
public class CryptedIdBinder : DefaultModelBinder
{
protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor)
{
if (propertyDescriptor.Name.ToLower() == "id")
{
propertyDescriptor.SetValue(bindingContext.Model, CryptoHelper.Decrypt(controllerContext.HttpContext.Request.Form["id"]));
return;
}
base.BindProperty(controllerContext, bindingContext, propertyDescriptor);
return;
}
После этого я установил новый DefaultBinder в global.asax для Application_Start:
System.Web.Mvc.ModelBinders.Binders.DefaultBinder = new CryptedIdBinder();
Я не наследовал от IModelBinderпотому что я хочу изменить логику привязки только для полей идентификатора в решении.
Проблема в том, что метод BindProperty никогда не вызывается.Что я делаю не так?
PS.Чтобы быть уверенным, что я вызываю хотя бы метод BindModel, я добавил код этого кода в свой пользовательский механизм связывания, и он был отлажен отладчиком:
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
return base.BindModel(controllerContext, bindingContext);
}