0

ASP MVC 4 プロジェクトがあります。新しい調査を作成しようとすると、コントローラーのコードも投稿されたフォーム データをモデルにバインドできないという問題があります。

具体的なエラーは次のとおりです。

タイプ 'System.String' からタイプ 'DNASurvey.Models.Tenant' へのパラメーター変換は、タイプ コンバーターがこれらのタイプ間で変換できないため、失敗しました。{System.InvalidOperationException}

それらは私が持っているモデルです:

public class Tenant {
    [Key]
    public string TenantID { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Survey> Surveys { get; set; }
  }

  public class Survey {
    [Key]
    public string SurveyID { get; set; }

    [Required]
    public virtual Tenant Tenant { get; set; }

    [Required]
    [StringLength(100, MinimumLength=5)]
    public string Title { get; set; }

    [Required]
    public DateTime CreatedAt { get; set; }

    [Required]
    public uint CurrentRoundIndex { get; set; }
  }

また、この関連コードを含む SurveyController もあります。

public ActionResult Create() {
  AddPossibleTenants();
  return View();
}

//
// POST: /Survey/Create

[HttpPost]
public ActionResult Create(Survey survey) {
  if (ModelState.IsValid) {
    survey.SurveyID = EncodeNameToSingleString(survey.Title);
    db.Surveys.Add(survey);
    db.SaveChanges();
    return RedirectToAction("Index");
  }

  AddPossibleTenants();
  return View(survey);
}

private void AddPossibleTenants() {
  ViewBag.PossibleTenants = db.Tenants.ToList();
}

そして、作成のためのこのビュー:

@model DNASurvey.Models.Survey

@{
    ViewBag.Title = "Create";
}

<h2>Create</h2>

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>Survey</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.Tenant)
        </div>
        <div class="editor-field">
            @Html.DropDownListFor(model => model.Tenant, new SelectList(ViewBag.PossibleTenants, "TenantID", "Name"))
            @Html.ValidationMessageFor(model => model.Tenant)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Title)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Title)
            @Html.ValidationMessageFor(model => model.Title)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.CreatedAt)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.CreatedAt)
            @Html.ValidationMessageFor(model => model.CreatedAt)
        </div>

        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}
4

2 に答える 2

0

フォームは、単純な名前と値のペアを返すテナントの選択要素を生成しています。Tenant はモデルでは文字列ではなくオブジェクトとして定義されているため、これはモデルの Tenant プロパティにバインドされません。これを機能させるには、独自のカスタム モデル バインダーを定義する必要があります。

于 2012-08-05T13:12:04.257 に答える
0

EF と MVC に関するこの一連の投稿を見つけました。 この投稿では、scaffold コマンドを使用してコントローラーを作成する方法と、EF と MVC の両方が正しく機能するようにモデルを構築する方法について説明します。

于 2012-08-05T13:39:53.643 に答える