c# - 如何使用同一模型中的两个下拉菜单实例?

标签 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 的 Create Controller/View 中。下拉列表工作完美,并在两个关联菜单中显示家庭成员,关系也显示在 relationType 下拉列表中。但是,当我单击创建时,所有值都设置为空。

创建 Controller :

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

创建 View :

    @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")
    }

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

最佳答案

@Html.DropDownList("familyMember"

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

@Html.DropDownList("familyMemberPrimary"

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

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

您还需要为 familyMemberSecondary 添加一个下拉列表

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

这应该让你非常接近..

@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, new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.DropDownListFor(a => a.familyMemberPrimary, (SelectList)ViewBag.familyMember, new { @class = "form-control" })
                @Html.ValidationMessageFor(model => model.familyMemberPrimary, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.familyMemberSecondary, new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.DropDownListFor(a => a.familyMemberSecondary, (SelectList)ViewBag.familyMember, new { @class = "form-control" })
                @Html.ValidationMessageFor(model => model.familyMemberSecondary, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.relationshipType, new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.DropDownListFor(a => a.relationshipType, (SelectList)ViewBag.relationship, 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")
}

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

DotNetFiddle Example

关于c# - 如何使用同一模型中的两个下拉菜单实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38640702/

相关文章:

jquery - 鼠标悬停时更改热点区域的颜色

jquery - 如何为日期时间选择器文本框应用样式

c# - 确定 DynamicObject 成员访问的预期类型

asp.net - 如何在 Razor View 引擎中实现 foreach 委托(delegate)?

c# - 无法使用 IP 地址访问 ASP.NET Web API

html - 如何将网页内容堆叠成两列并保持页面大小一致

asp.net-mvc - 用于 Web 开发的 Silverlight 或 MVC

c# - 在两个项目中找不到属性的架构信息

c# - 选择 namespace 名称时我应该知道什么?

c# - 一个查询的结果不能被多次枚举异常