【问题标题】:Is it possible to have a non-public parameterless constructor that can be used for model binding?是否可以有一个可用于模型绑定的非公共无参数构造函数?
【发布时间】:2017-10-30 21:47:52
【问题描述】:

我有以下 POCO 课程。我不希望无参数构造函数公开。

public class FileDownloadRequest
    {
       //public FileDownloadRequest() { }
        public FileDownloadRequest(int fileId, RepositoryFolderTypes fileType) //RepositoryFolderTypes is an enum, not a class
        {
            this.FileId = fileId;
            this.FileType = fileType;
        }
        public int FileId { get; set; }
        public RepositoryFolderTypes FileType { get; set; } //an enum
    }

当我尝试对以下控制器操作发出 https://10.27.8.6/Files/DownloadFile?fileId=1&folderType=SRC 请求时,我收到一条错误消息,指出此对象不存在无参数构造函数。

[HttpGet]
public async Task<HttpResponseMessage> DownloadFile([FromUri] FileDownloadRequest request)
{
}

是否可以有一个非公共的构造函数,还是绝对需要一个公共的?

【问题讨论】:

  • XY problem为什么你不想要一个 MVC 默认需要的无参数构造函数?
  • @TimothyGroote 不,这个问题只是提到了 OP 得到的错误的解决方案,即添加一个无参数的构造函数。
  • 隐藏具有读/写属性的 POCO 的无参数构造函数只是废话
  • @CodeCaster 嗯,应该读得更好。我想有人澄清了为什么它需要在该线程中公开。对不起。
  • This answer 类似的问题可能会对您有所帮助。

标签: c# asp.net model-view-controller model-binding


【解决方案1】:

此外,虽然帕特里克的回答很棒并且展示了如何去做(在这种大量努力确实有意义的情况下),但我只是添加了一些我在另一个 SO post 中注意到的内容。

基本上,将无参数构造函数标记为[Obsolete("Comment to indicate its for binding only")],这样可以防止其他人意外调用无参数构造函数。 (从而明确显示请求对象需要哪些属性)

【讨论】:

    【解决方案2】:

    是的,你可以使用任何你喜欢的构造函数,但是你必须自己做模型绑定。问题出在DefaultModelBinder.CreateModel,它使用了parameterless public constructor

    您必须覆盖默认模型绑定器并创建自己的模型绑定器。是否值得,时间取决于您。

    采取的步骤:

    • 覆盖CreateModel;
    • 检查modelType 中的一些通用约束,您需要调用带有参数的构造函数的模型;
    • 使用参数调用Activator.CreateInstance(Type, Object[])。您可以从bindingContext 获取它们的值;
    • 通过ModelBinder 属性或全局注册模型绑定器。

    Read more on custom bindings here.

    【讨论】:

    • 是的,因为根本不需要创建无参数构造函数并应用 [Required] 属性,OP 似乎真正想要的是什么。
    • @Bartosz 阅读 “如果值得,时间由你决定” 并让它沉入其中。你现在不仅要花费大量时间解决方案更简单的事情,您也容易遇到错误,并使您以后的自己和该项目的未来开发人员感到困惑。
    • @Patrick 这就是为什么您不使用来自您自己的 MVC 项目(除了单独的视图模型程序集)之外的模型作为视图模型的原因。只需创建一个简单的 POCO 并映射到那个 POCO。 :)
    • 我看到那个来了@CodeCaster :)
    • 把它当成是我的小毛病! :D 我经常看到它出错。是的,我自己也玩过模型活页夹,这很有趣,但对于一般的应用程序,你真的不想这样做。
    猜你喜欢
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    相关资源
    最近更新 更多