10 votes

Aucun constructeur sans paramètre défini pour cet objet. dans ASP.NET MVC Controller

Je suis sûr que c'est assez simple, mais je suis un peu bloqué ici. Le routage défini pour mon application est simplement celui par défaut. J'ai défini le contrôleur suivant.

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();
        }
    }
}

Lorsque je navigue vers /Admin/EditDocument/1/ alors la première action s'exécute exactement comme prévu, rendant la vue suivante:-

<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" />
}

En soumettant cette demande, j'obtiens une erreur : -.

No parameterless constructor defined for this object. Autres questions apparemment liées MVC : Aucun constructeur sans paramètre défini pour cet objet suggère que le conteneur IoC n'est pas correctement configuré, mais le fait que la première action s'exécute sans problème signifie sûrement que ce n'est pas le problème ici ?

Toute aide serait grandement appréciée.

Regards.

Simon

15voto

Mediator Points 2947

Ajouter au constructeur par défaut de la classe DocumentEditViewModel

public DocumentEditViewModel (){}

5voto

JTMon Points 2339

Le cadre MVC essaie de créer une instance de la classe DocumentViewModel, mais il ne trouve pas de constructeur par défaut accessible au public (qui ne prend pas d'arguments). Vous pouvez soit définir un tel constructeur par défaut comme @simplyDenis l'a suggéré, soit définir un ModelBinder cusotm qui peut créer l'instance en utilisant votre constructeur personnalisé.

1voto

chrisn Points 198

Est-ce que DocumentEditViewModel a un constructeur sans paramètre ? Je pense que c'est nécessaire pour le modelbinding sur votre post view.

1voto

Il est fort probable que vous ayez un mécanisme d'injection de dépendance. Mais MVC exige une méthode "spéciale" pour enregistrer le conteneur. Regardez ce lien Ajouter l'unité à vos applications Web, modèles et pratiques

0voto

Jess Points 2039

J'ai eu un problème légèrement différent. Une de mes classes de modèle était abstract .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X