Is it possible to have a non-public parameterless constructor that can be used for model binding?

前端 未结 2 1052
醉话见心
醉话见心 2021-01-24 20:39

I have a following POCO class. I don not want the parameterless constructor to be public.

public class FileDownloadRequest
    {
       //public FileDownloadRequ         


        
相关标签:
2条回答
  • 2021-01-24 21:05

    Also, while Patrick's answer is great and shows how to do it (in scenarios where this much effort really makes sense), I just add something I've noticed in another SO post.

    Basically, mark the parameterless constructor as [Obsolete("Comment to indicate its for binding only")] and that will prevent others from accidentally calling the parameterless one. (Thus showing explicitly which properties are required by the request object)

    0 讨论(0)
  • 2021-01-24 21:18

    Yes, you can use any constructor you like, but you will have to do the model binding yourself then. The problem is in DefaultModelBinder.CreateModel, which uses a parameterless public constructor.

    You have to override the default model binder and create your own. If that is worth the time is up to you.

    Steps to take:

    • Override CreateModel;
    • Check the modelType for some generic constraint which models you need to call the constructor with parameters on;
    • Call Activator.CreateInstance(Type, Object[]) with the parameters. You could obtain their values from the bindingContext;
    • Register the model binder, either through the ModelBinder attribute, or globally.

    Read more on custom bindings here.

    0 讨论(0)
提交回复
热议问题