6

私は C# と MVC を初めて使用するので、素朴さ/愚かさを許してください。私が持っているエラーを扱っている複数の投稿を見て、すべての解決策を試しましたが、私の場合はうまくいかないようです。この問題を解決する正しい方法を教えてください。

背景: tblPrograms と tblReports の 2 つのモデルがあります。ユーザーが新しい tblReport を作成できる単純なフォームを作成しようとしています。新しい tblReport を作成するプロセスの一部として、リストから 1 つの 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);
    }

モデルを見る:

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

モデル:

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

}

ヘルパー メソッド:

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;

    }

意見:

@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>

エラー:

![Exception Details: System.MissingMethodException: No parameterless constructor defined for this object.][1]

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

試みられた解決策:

  1. ProgramListModel で SelectList の代わりに IEnumerable <tblPrograms> を使用するようにコードをリファクタリングし、以下のサンプルのような関数を使用して 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()
                   });
     }
    
  2. ProgramListModel で SelectList の代わりに IEnumerable<SelectListItem> を使用するようにコードをリファクタリングしました

よろしくお願いします!!

4

1 に答える 1

10

いいえ、それはできません:

public ActionResult GenerateSQL(ExistingReportViewModel evrm)

ExistingReportViewModelパラメータなしのコンストラクタがない場合。既定のモデル バインダーは、既定のコンストラクターがない場合、このクラスをインスタンス化する方法を知りません。

したがって、2 つの可能性があります。

  1. このクラスにパラメーターなしのコンストラクターを定義します。

    public class ExistingReportViewModel
    {
        public ExistingReportViewModel()
        { }
    
        ... some other stuff of course
    }
    
  2. カスタム モデル バインダーを作成する

特別なものが必要でない限り、間違いなく 1. を選択してください。非常に特別なものが必要な場合は、それを正確に定義してください。2.

于 2012-07-10T20:09:23.963 に答える