无法将所选项目从DropDownList设置为控制器

时间:2013-01-06 11:13:12

标签: c# asp.net-mvc ef-code-first

在我看来DropDownList显示正确的字段但是当我在“编辑或创建”中选择一个时,该字段将被保存/修改为NULL。调试时我可以看到新值没有发送。我认为ID和SurveyID之间存在不匹配...

查看:

@model Project_ASP_2012.Models.QuestionGroup

@{
ViewBag.Title = "Edit";
}

<h2>Edit</h2>

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

<fieldset>
    <legend>QuestionGroup</legend>

    @Html.HiddenFor(model => model.ID)


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

    <div class="editor-label">
        @Html.LabelFor(model => model.SurveyID, "Survey")
    </div>
    <div class="editor-field">
        @Html.DropDownList("Id", String.Empty)
        @Html.ValidationMessageFor(model => model.SurveyID)
    </div>

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

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

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

型号:

public class Survey : IEntity
{


    [Key]
    [Display(Name = "SurveyID")]
    public int ID { get; set; }

    [Required(ErrorMessage = "Survey title is required.")]
    [Display(Name = "Survey Title")]
    [MaxLength(20, ErrorMessage = "Title cannot be longer than 20 characters.")]
    public string Title { get; set; }

    [MaxLength(50, ErrorMessage = "Description cannot be longer than 50 characters.")]
    public string Description { get; set; }

    public virtual ICollection<QuestionGroup> QuestionGroups { get; set; }

}

public class QuestionGroup : IEntity
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ID { get; set; }

    [MaxLength(50, ErrorMessage = "Description cannot be longer than 50 characters.")]
    public string Description { get; set; }

    [Display(Name = "SurveyID")]
    public int? SurveyID { get; set; }

    public virtual Survey Survey { get; set; }

}

控制器:

    public ActionResult Edit(int id)
    {
        QuestionGroup questiongroup = unitOfWork.QuestionGroupRepository.GetById(id);
        if (questiongroup == null)
        {
            return HttpNotFound();
        }

        PopulateSurveysDropDownList(questiongroup.SurveyID);
        return View(questiongroup);
    }

    //
    // POST: /QuestionGroup/Edit/5

    [HttpPost]
    public ActionResult Edit(QuestionGroup questiongroup)
    {
        try
        {
           if (ModelState.IsValid)
            {
                unitOfWork.UoWContext.Entry(questiongroup).State = EntityState.Modified;
                unitOfWork.SaveChanges();
                return RedirectToAction("Index");
            }
        }
        catch (DataException)
        {
            ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists see your system administrator.");
        }
        PopulateSurveysDropDownList(questiongroup.SurveyID);
        return View(questiongroup);
    }


    private void PopulateSurveysDropDownList(object selectedSurvey = null)
    {
        var surveyQuery = unitOfWork.SurveyRepository.Get(
            orderBy: q => q.OrderBy(d => d.Title));
        ViewBag.Id = new SelectList(surveyQuery, "Id", "Title", selectedSurvey);
    }

2 个答案:

答案 0 :(得分:0)

在您的视图中,您有Id而不是SurveyId的下拉列表。另外,你有两次ID - 在下拉列表和隐藏字段中。

<div class="editor-field">
    @Html.DropDownList("Id", String.Empty)
    @Html.ValidationMessageFor(model => model.SurveyID)
</div>

答案 1 :(得分:0)

尝试更改:

private void PopulateSurveysDropDownList(object selectedSurvey = null)
{
    var surveyQuery = unitOfWork.SurveyRepository.Get(
        orderBy: q => q.OrderBy(d => d.Title));
    ViewBag.Id = new SelectList(surveyQuery, "Id", "Title", selectedSurvey);
}

....

<div class="editor-field">
    @Html.DropDownList("Id", String.Empty)
    @Html.ValidationMessageFor(model => model.SurveyID)
</div>

要:

private void PopulateSurveysDropDownList(object selectedSurvey = null)
{
    var surveyQuery = unitOfWork.SurveyRepository.Get(
        orderBy: q => q.OrderBy(d => d.Title));
    //don't provide the select value here.  you will bind to it in your view
    ViewBag.SurveySelectList = new SelectList(surveyQuery, "Id", "Title");
}

....

<div class="editor-field">
    //selected value will be whatever SurveyID is on your model.
    @Html.DropDownListFor(model => model.SurveyID, ViewBag.SurveySelectList, String.Empty)
    @Html.ValidationMessageFor(model => model.SurveyID)
</div>

希望有所帮助。