如何使用同一型号的两个下拉菜单实例?

时间:2016-07-28 15:28:21

标签: c# asp.net asp.net-mvc

我遇到了一个问题,我认为我已经正确设置了,但结果总是没有。

以下是三种模式:

public class FamilyMember
{
    [Key]
    public int id { get; set; }
    [Required]
    [Display(Name = "First Name")]
    public string firstName { get; set; }
    [Required]
    [Display(Name = "Surname")]
    public string surname { get; set; }
    [Required]
    [Display(Name = "Date of Birth")]
    public DateTime dob { get; set; }

    public virtual FamilyRelationship FamilyRelationship { get; set; }

    [Display(Name = "Full Name")]
    public string fullName
    {
        get
        {
            return string.Format("{0} {1}", firstName, surname);
        }
    }
}

public class RelationshipType
{
    [Key]
    public int id { get; set; }
    [Required]
    [Display(Name="Relationship Type")]
    public string relationshipType { get; set; }
    public virtual FamilyRelationship FamilyRelationship { get; set; }
}

public class FamilyRelationship
{
    [Key]
    public int id { get; set; }
    [ForeignKey("FamilyMembers")]
    [Display(Name = "First Family Member")]
    public int familyMemberPrimary { get; set; }
    [ForeignKey("FamilyMembers")]
    [Display(Name = "Second Family Member")]
    public int familyMemberSecondary { get; set; }
    [Display(Name = "Relationship Type")]
    public int relationshipType { get; set; }
    public virtual ICollection<FamilyMember> FamilyMembers { get; set; }
    public virtual ICollection<RelationshipType> RelationshipTypes { get; set; }
}

因此,我已成功将数据添加到FamilyMemberRelationshipType,并且CRUD运行正常。

问题出现在FamilyRelationship的创建控制器/视图中。下拉列表工作正常,并在两个相关菜单中显示家庭成员,并且关系也显示在relationType下拉列表中。但是,当我单击create时,所有值都设置为null。

创建控制器:

    // GET: FamilyRelationships/Create
    public ActionResult Create()
    {
        ViewBag.familyMember = new SelectList(db.FamilyMembers, "id", "fullName");
        ViewBag.relationship = new SelectList(db.RelationshipTypes, "id", "relationshipType");
        return View();
    }

    // POST: FamilyRelationships/Create

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create([Bind(Include = "id,familyMemberPrimary,familyMemberSecondary,relationshipType")] FamilyRelationship familyRelationship)
    {
        if (ModelState.IsValid)
        {
            db.FamilyRelationships.Add(familyRelationship);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        return View(familyRelationship);
    }

创建视图:

    @model FamilyTree.Models.FamilyRelationship

    @{
        ViewBag.Title = "Create";
    }

    <h2>Create</h2>


    @using (Html.BeginForm()) 
    {
        @Html.AntiForgeryToken()

        <div class="form-horizontal">
            <h4>FamilyRelationship</h4>
            <hr />
            @Html.ValidationSummary(true, "", new { @class = "text-danger" })
            <div class="form-group">
                @Html.LabelFor(model => model.familyMemberPrimary, htmlAttributes: new { @class = "control-label col-md-2" })
                <div class="col-md-10">
                    @*@Html.EditorFor(model => model.familyMemberPrimary, new { htmlAttributes = new { @class = "form-control" } })
                    @Html.ValidationMessageFor(model => model.familyMemberPrimary, "", new { @class = "text-danger" })*@

                    @Html.DropDownList("familyMember", null, htmlAttributes: new { @class = "form-control" })
                    @Html.ValidationMessageFor(model => model.familyMemberPrimary, "", new { @class = "text-danger" })
                </div>
            </div>

            <div class="form-group">
                @Html.LabelFor(model => model.familyMemberSecondary, htmlAttributes: new { @class = "control-label col-md-2" })
                <div class="col-md-10">
                    @Html.DropDownList("familyMember", null, htmlAttributes: new { @class = "form-control" })
                    @Html.ValidationMessageFor(model => model.familyMemberPrimary, "", new { @class = "text-danger" })
                </div>
            </div>

            <div class="form-group">
                @Html.LabelFor(model => model.relationshipType, htmlAttributes: new { @class = "control-label col-md-2" })
                <div class="col-md-10">
                    @Html.DropDownList("relationship", null, htmlAttributes: new { @class = "form-control" })
                    @Html.ValidationMessageFor(model => model.relationshipType, "", new { @class = "text-danger" })
                </div>
            </div>

            <div class="form-group">
                <div class="col-md-offset-2 col-md-10">
                    <input type="submit" value="Create" class="btn btn-default" />
                </div>
            </div>
        </div>
    }

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

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

请让我知道我哪里出错了,如果可能的话,请提供一个示例来完成这项工作。

2 个答案:

答案 0 :(得分:2)

private void Flush() { using (DataContext db = new DataContext() { foreach(Log l in _logs) { db.Logs.Add(new LogObject() { propX = "blabla" }); } db.SaveChanges(); // save #2 } }

您需要使用最有可能的实际属性名称

@Html.DropDownList("familyMember"

您还必须重命名viewbag属性以匹配要显示的项目..或使用dropdownlistfor

@Html.DropDownList("familyMemberPrimary"

您还需要为familyMemberSecondary

添加下拉列表
@Html.DropDownListFor(a => a.familyMemberPrimary, (SelectList)ViewBag.familyMember , new { @class = "form-control" })

这应该让你非常接近......

@Html.DropDownListFor(a => a.familyMemberSecondary, (SelectList)ViewBag.familyMember , new { @class = "form-control" })

确保在POST失败后重新设置ViewBag属性

DotNetFiddle Example

答案 1 :(得分:1)

这是预期的行为。记住Http是无国籍的。因此,您需要在返回视图之前重新加载下拉数据

 [HttpPost]
 [ValidateAntiForgeryToken]
 public ActionResult Create([Bind(Include = "id,familyMemberPrimary,familyMemberSecondary,
                                  relationshipType")] FamilyRelationship familyRelationship)
 {
     if (ModelState.IsValid)
     {
         db.FamilyRelationships.Add(familyRelationship);
         db.SaveChanges();
         return RedirectToAction("Index");
     }

    //Let's reload the data for dropdown.
    ViewBag.familyMember = new SelectList(db.FamilyMembers, "id", "fullName");
    ViewBag.relationship = new SelectList(db.RelationshipTypes, "id", "relationshipType");

    return View(familyRelationship);
 }

编辑: 根据评论

  

FamilyRelationship中的值如此familyMemberPrimary,   familyMemberSecondary和relationshipType的值为0,其中I   我希望每个人的身份都会被遗漏。

因为您在视图中使用EditorFor辅助方法来处理familyMemberPrimary属性。因此,如果您没有在该输入字段中填充值,则它将具有默认值(对于int类型为0)

如果您希望使用下拉列表选择(家庭成员)填充该属性,则应将下拉列表名称设为familyMemberPrimary,以便在发布表单时,模型绑定将设置所选的选项值to familyMemberPrimary property。

@Html.DropDownList("familyMemberPrimary", 
           ViewBag.familyMember as IEnumerable<SelectListItem>, 
           htmlAttributes: new { @class = "form-control" })