0

私はどこが間違っているのかを理解しようとしている時間のバグを抱えています。シナリオはこれ。外部キーを持つオブジェクトを mvc エンティティ フレームワークで追加しようとしています。

public class Person
{
    [Key]
    public virtual int PersonId { get; set; }
    [Display(Name = "First Name")]
    [Required]
    [MaxLength(50)]
    public virtual string FirstName { get; set; }
    [Display(Name = "Last Name")]
    [Required]
    [MaxLength(50)]
    public virtual string LastName { get; set; }
    [Required]
    public virtual int TestItem { get; set; }
    [Required(ErrorMessage = "Please Select an Employee Type")]
    public virtual EmployeeType EmployeeTypeId { get; set; }
}


 public class EmployeeType
{
    [Key]
    public virtual int EmployeeTypeId { get; set; }
    [Required]
    public virtual string EmployeeTypeName { get; set; }


}

これらは、エンティティの 2 つの poco です。

 public ActionResult Create()
    {
        PersonViewModel pv = new PersonViewModel();
        ViewBag.EmployeeTypeSelect= new SelectList(db.EmployeeTypes, "EmployeeTypeId", "EmployeeTypeName");
        return View(pv);
    }

    //
    // POST: /Person/Create

    [HttpPost]
    public ActionResult Create(PersonViewModel personVM)
    {
        if (ModelState.IsValid)
        {
            Person person = new Person();
            person.EmployeeTypeId = personVM.EmployeeTypeId;
            person.FirstName = personVM.FirstName;
            person.LastName = personVM.LastName;
            person.TestItem = personVM.TestItem;
            db.Persons.Add(person);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        return View(personVM);
    }

それがコントローラーです。

@model MvcApplication3.Models.PersonViewModel

@{
ViewBag.Title = "Create";
}

<h2>Create</h2>

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

<fieldset>
    <legend>PersonViewModel</legend>

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

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

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

    <div class="editor-label">
        @Html.LabelFor(model => model.EmployeeTypeId)
    </div>
    <div class="editor-field">
        @Html.DropDownListFor(model=>model.EmployeeTypeId,(SelectList)ViewBag.EmployeeTypeSelect)
        @Html.ValidationMessageFor(model => model.EmployeeTypeId)
    </div>




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

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

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

それがビューです。

最初の取得からのビューではすべてが正常に機能しますが、投稿すると、EmployeeTypeId に null 値が含まれます。ソースを確認すると、選択リストに問題がなく、適切な値とテキストがあります。どこが悪いのかさっぱり分からないので教えてください。

ありがとう

4

2 に答える 2

0

投稿したいすべての値の後に Html.EndForm() を HTML に追加してみて、問題が解決するかどうかを確認してください。

于 2013-01-30T00:23:59.373 に答える
0

モデルバインディングが機能するには、Person および EmployeeType クラスにデフォルト (空の) コンストラクターが必要です。

 public class EmployeeType
{
    [Key]
    public virtual int EmployeeTypeId { get; set; }
    [Required]
    public virtual string EmployeeTypeName { get; set; }

    public EmployeeType()
    {
    }
}

public class Person {
    [Key]
    public virtual int PersonId { get; set; }
    [Display(Name = "First Name")]
    [Required]
    [MaxLength(50)]
    public virtual string FirstName { get; set; }
    [Display(Name = "Last Name")]
    [Required]
    [MaxLength(50)]
    public virtual string LastName { get; set; }
    [Required]
    public virtual int TestItem { get; set; }
    [Required(ErrorMessage = "Please Select an Employee Type")]
    public virtual EmployeeType EmployeeTypeId { get; set; }

    public Person()
    {
       EmployeeTypeId = new EmployeeType();
    }
}

また、あなたの見解で試してみてください。

@Html.DropDownListFor(model=>model.EmployeeTypeId.EmployeeTypeId,(SelectList)ViewBag.EmployeeTypeSelect)

于 2013-01-30T00:35:56.567 に答える