没有为此对象定义无参数构造函数 - 无法解决

Saj*_*kar 5 c# asp.net-mvc-3

我是C#和MVC的新手,所以请原谅任何天真/愚蠢.我已经看到多个帖子处理我的错误,我已经尝试了所有的解决方案,但它们似乎在我的情况下工作.请引导我找到解决此问题的正确方法.

背景: 我有2个模型tblPrograms和tblReports.我正在尝试构建一个简单的表单,用户可以在其中创建新的tblReport.创建新tblReport的部分过程是从列表中选择一个tblProgram.

代码概述:

控制器:

    // 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);
    }
Run Code Online (Sandbox Code Playgroud)

查看型号:

 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;   
    }    
}
Run Code Online (Sandbox Code Playgroud)

楷模:

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

}
Run Code Online (Sandbox Code Playgroud)

助手方法:

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;

    }
Run Code Online (Sandbox Code Playgroud)

视图:

@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>
Run Code Online (Sandbox Code Playgroud)

错误:

![Exception Details: System.MissingMethodException: No parameterless constructor defined for this object.][1]
Run Code Online (Sandbox Code Playgroud)

http://i.stack.imgur.com/GHJpG.jpg

尝试的解决方案:

  1. 重构代码以使用IEnumerable <tblPrograms>而不是ProgramListModel中的SelectList,并使用类似于以下示例的函数在View中转换为IEnumerable:

    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()
                   });
     }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 重构代码以在ProgramListModel中使用IEnumerable <SelectListItem>而不是SelectList

提前谢谢了!!

Dar*_*rov 9

不,你做不到:

public ActionResult GenerateSQL(ExistingReportViewModel evrm)
Run Code Online (Sandbox Code Playgroud)

如果你ExistingReportViewModel没有无参数构造函数.如果默认模型绑定器没有默认构造函数,则它不知道如何实例化该类.

所以你有两种可能性:

  1. 为此类定义一个无参数构造函数:

    public class ExistingReportViewModel
    {
        public ExistingReportViewModel()
        { }
    
        ... some other stuff of course
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 编写自定义模型绑定器

绝对要去1.除非你需要非常特别的东西.如果您需要非常特别的东西,请准确定义,以便我们为您提供帮助2.