ASP.NET MVC 2 - Binding To Abstract Model

前端 未结 3 759
独厮守ぢ
独厮守ぢ 2020-12-09 05:36

If i have the following strongly-typed view:

<%@ Page Title=\"\" Language=\"C#\" MasterPageFile=\"~/Views/Shared/Site.Master\" Inherits=\"System.Web.Mvc.V         


        
3条回答
  •  死守一世寂寞
    2020-12-09 06:14

    You can also build a generic ModelBinder that works for all of your abstract models. My solution requires you to add a hidden field to your view called 'ModelTypeName' with the value set to the name of the concrete type that you want. However, it should be possible to make this thing smarter and pick a concrete type by matching type properties to fields in the view.

    In your Global.asax.cs file in Application_Start():

    ModelBinders.Binders.DefaultBinder = new CustomModelBinder();
    

    CustomModelBinder:

    public class CustomModelBinder2 : DefaultModelBinder 
    {
        public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            var modelType = bindingContext.ModelType;
            if (modelType.IsAbstract)
            {
                var modelTypeValue = controllerContext.Controller.ValueProvider.GetValue("ModelTypeName");
                if (modelTypeValue == null)
                    throw new Exception("View does not contain ModelTypeName");
    
                var modelTypeName = modelTypeValue.AttemptedValue;
    
                var type = modelType.Assembly.GetTypes().SingleOrDefault(x => x.IsSubclassOf(modelType) && x.Name == modelTypeName);
    
                if (type != null)
                {
                    var instance= bindingContext.Model ?? base.CreateModel(controllerContext, bindingContext, type);
                    bindingContext.ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(() => instance, type);
                }
            }
            return base.BindModel(controllerContext, bindingContext);
        }
    }
    

提交回复
热议问题