【问题标题】:No parameterless constructor defined for this object. in ASP.NET MVC Controller没有为此对象定义无参数构造函数。在 ASP.NET MVC 控制器中
【发布时间】:2017-09-14 18:46:28
【问题描述】:

我确信这很简单,但我有点卡在这里。为我的应用定义的路由只是默认值。我定义了以下控制器。

namespace Baynes.Wedding.Web.Controllers
{
    public class AdminController : Controller
    {
        private readonly IAuthProvider _authProvider;
        private readonly IDocumentRepository _documentRepository;

        public AdminController(IAuthProvider authProvider, IDocumentRepository documentRepository)
        {
            _authProvider = authProvider;
            _documentRepository = documentRepository;
        }

        public ViewResult EditDocument(int id)
        {
            var document = _documentRepository.Select(id);

            return View(new DocumentEditViewModel(document));
        }

        [HttpPost]
        public ActionResult EditDocument(DocumentEditViewModel model)
        {
            if (ModelState.IsValid)
            {
                _documentRepository.Update(model.ToDocument());
                return RedirectToAction("ListDocuments");
            }

            return View();
        }
    }
}

当我导航到/Admin/EditDocument/1/ 时,第一个操作完全按预期执行,呈现以下视图:-

<h2>@ViewBag.Title</h2>
@using (Html.BeginForm("EditDocument", "Admin", FormMethod.Post)) {
    @Html.ValidationSummary(true)
    @Html.HiddenFor(m => Model.Id)
    <div>
        @Html.LabelFor(m => Model.Title)
    </div>
    <div>
        @Html.TextBoxFor(m => Model.Title)
    </div>
    <div>
        @Html.LabelFor(m => Model.Body)
    </div>
    <div>
        @Html.TextAreaFor(m => Model.Body)
    </div>
    <div>
        @Html.LabelFor(m => Model.Url)
    </div>
    <div>
        @Html.TextBoxFor(m => Model.Url)
    </div>

    <input type="submit" value="Edit" />
}

提交时出现错误:-

No parameterless constructor defined for this object. 其他问题看似相关的问题MVC: No parameterless constructor defined for this object 建议这与未正确设置 IoC 容器有关,但可以肯定的是,第一个操作执行没有问题意味着这不是问题在这里?

任何帮助将不胜感激。

问候。

西蒙

【问题讨论】:

  • 能否提供 DocumentViewModel 的代码

标签: asp.net-mvc


【解决方案1】:

添加到类 DocumentEditViewModel 默认构造函数

public DocumentEditViewModel (){}

【讨论】:

  • 为什么这是必要的?在我看来,控制器应该有系统创建的默认构造函数,就像大多数类一样。
  • @levininja JTMon 回答了你的问题
  • @Mediator 我的问题是:设计 MVC 框架背后的想法是不假设控制器类的默认构造函数,就像 .NET 默认对所有类所做的那样。如果没有指定,编译器通常假定一个空的构造函数。对控制器类不这样做对我来说特别荒谬。
  • @levininja,DefaultModelBinder 使用 System.Activator.CreateInstance(类型类型)。文档告诉我们“使用该类型的默认构造函数创建指定类型的实例。”
【解决方案2】:

MVC 框架正在尝试创建 DocumentViewModel 类的实例,但找不到可公开访问的默认构造函数(不接受任何参数)。您可以定义像 @simplyDenis 建议的这样的默认构造函数,也可以定义一个可以使用自定义构造函数创建实例的 cusotm ModelBinder。

【讨论】:

    【解决方案3】:

    DocumentEditViewModel 有无参数构造函数吗?我相信这是在您的帖子视图上进行模型绑定所必需的。

    【讨论】:

      【解决方案4】:

      很可能你有依赖注入机制。 但是 MVC 需要“特殊”的方式来注册容器。 看这个链接Adding Unity to Your Web Applications, patterns and practices

      【讨论】:

        【解决方案5】:

        我遇到了一个稍微不同的问题。我的模型课程之一是abstract

        【讨论】:

          【解决方案6】:

          如果 DocumentEditViewModel 构造函数的可访问性级别受到保护,您也会遇到相同的错误。

          【讨论】:

            猜你喜欢
            • 2010-11-24
            • 2013-04-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-02-11
            • 1970-01-01
            • 2012-08-31
            相关资源
            最近更新 更多