Pas de constructeur sans paramètre défini pour cet objet - l'Impossibilité de Résoudre
Je suis nouveau en C# et MVC alors pardonne tout naiveness/stupidité. J'ai vu plusieurs posts traitant de l'erreur que j'ai et j'ai essayé toutes les solutions, mais ils ne semblent fonctionner dans mon cas. Merci de me guider vers la bonne voie pour résoudre ce problème.
De fond:
J'ai 2 modèles tblPrograms et tblReports.
Je suis en train de créer un simple formulaire où l'utilisateur peut créer un nouveau tblReport. Une partie du processus de création d'un nouveau tblReport est de sélectionner l'un tblProgram à partir d'une liste.
Code De Présentation:
Contrôleur:
//GET: /Reports/
public ViewResult New()
{
ProgramListModel progList = new ProgramListModel();
tblReports2 report = new tblReports2();
ExistingReportViewModel ervm = new ExistingReportViewModel(report,progList);
return View(ervm);
}
[HttpPost]
public ActionResult GenerateSQL(ExistingReportViewModel evrm)
{
evrm.Report.ProgramName = evrm.progList.selectedProgram;
return View(evrm);
}
Modèle De Vue:
public class ExistingReportViewModel
{
public tblReports2 Report { get; set; }
public ProgramListModel progList { get; set; }
//public ExistingReportViewModel() { }
public ExistingReportViewModel(tblReports2 report, ProgramListModel progList)
{
this.Report = report;
this.progList = progList;
}
}
Modèles:
public class tblReports2
{
[Key]
public string ProgramName { get; set; }
public string ReportDesc { get; set; }
....
}
public class ProgramListModel
{
public SelectList progList;
public string selectedProgram;
public ProgramListModel() {
ReportHelper helper = new ReportHelper();
this.progList = helper.getProgramList();
}
}
Méthode D'Assistance:
public SelectList getProgramList()
{
var programs = from p in this.DB.tblProgramsSet
select p;
programs = programs.Where(s => s.ProgramType.Equals("RPT"));
SelectList list = new SelectList(programs, "ProgramName", "ProgramDescription");
return list;
}
Vue:
@model ReportsSetup.Models.ExistingReportViewModel
@{
ViewBag.Title = "New";
}
New
@using (Html.BeginForm("GenerateSQL", "Reports"))
{
@Html.ValidationSummary(true)
<fieldset>
<legend>ExistingReportViewModel</legend>
@Html.DropDownListFor(model=>model.progList.selectedProgram, Model.progList.progList)
<div class="editor-label">
@Html.LabelFor(model => model.Report.ReportDesc)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Report.ReportDesc)
@Html.ValidationMessageFor(model => model.Report.ReportDesc)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Report.Formerly)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Report.Formerly)
@Html.ValidationMessageFor(model => model.Report.Formerly)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Report.ExtendedDesc)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Report.ExtendedDesc)
@Html.ValidationMessageFor(model => model.Report.ExtendedDesc)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Report.ReportCode)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Report.ReportCode)
@Html.ValidationMessageFor(model => model.Report.ReportCode)
</div>
...
<input type="submit" value="Create" />
</fieldset>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
Erreur:
![Exception Details: System.MissingMethodException: No parameterless constructor defined for this object.][1]
http://i.stack.imgur.com/GHJpG.jpg
Tentatives De Solutions:
-
Refait le code à utiliser IEnumerable <tblPrograms> au lieu de
SelectList dans ProgramListModel et de conversion d'
IEnumerable en Vue à l'aide d'une fonction similaire à
exemple ci-dessous:public static IEnumerable<SelectListItem> ToSelectListItems( this IEnumerable<Album> albums, int selectedId) { return albums.OrderBy(album => album.Name) .Select(album => new SelectListItem { Selected = (album.ID == selectedId), Text = album.Name, Value = album.ID.ToString() }); }
-
Refait le code à utiliser IEnumerable<SelectListItem> au lieu de
SelectList dans ProgramListModel
Merci beaucoup d'Avance!!
OriginalL'auteur Sajjan Sarkar | 2012-07-10
Vous devez vous connecter pour publier un commentaire.
Non, vous ne pouvez pas le faire:
si votre
ExistingReportViewModel
ne pas avoir un constructeur sans paramètre. Le modèle de classeur par défaut ne sais pas comment instancier cette classe si elle ne possède pas de constructeur par défaut.Si vous avez 2 possibilités:
Définir un parametrless constructeur de cette classe:
Écrire un modèle de liaison personnalisé
Certainement aller pour 1. sauf si vous avez besoin quelque chose de très spécial. Si vous avez besoin de quelque chose de très spécial alors s'il vous plaît définir avec précision, de sorte que nous pouvons vous aider avec les 2.
À l'intérieur de votre
[HttpPost]
action que vous devez être en mesure d'obtenir la valeur sélectionnée dans la liste déroulante dansevrm.progList.selectedProgram
.Qui ne devrait pas se produire normalement. Essayez de supprimer les autres constructeur.
La page est vide/null, dans mon POST vue de l'action, je dis:
using System.Web.Script.Serialization; @model ReportsSetup.Models.ExistingReportViewModel @{ ViewBag.Title = "GenerateSQL"; } <h2>GenerateSQL</h2> @Model.progList.selectedProgram @Model.Report.ProgramName @Html.Raw(new JavaScriptSerializer().Serialize(Model))
:Je suis incapable de correctement post code mis en forme: À votre suggestion, si je supprime l'autre constructeur, je ne voudrais pas être en mesure de lier la tblPrograms liste pour le viewModel,non?
// GET: /Reports/ public ViewResult New() { ProgramListModel progList = new ProgramListModel(); tblReports2 report = new tblReports2(); ExistingReportViewModel ervm = new ExistingReportViewModel(report,progList); return View(ervm); }
OriginalL'auteur Darin Dimitrov