没有为此对象定义的无参数构造函数。在ASP.NET MVC控制器中

时间:2013-01-17 07:38:56

标签: asp.net-mvc

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

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容器没有正确设置有关,但肯定是第一个操作执行没有问题的事实意味着这是问题所在吗?

非常感谢任何帮助。

问候。

西蒙

6 个答案:

答案 0 :(得分:15)

添加到类DocumentEditViewModel默认构造函数

public DocumentEditViewModel (){}

答案 1 :(得分:5)

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

我的问题略有不同。我的一个Model类是abstract

答案 5 :(得分:0)

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