2016-07-28 2 views
1

У меня проблема, когда я думаю, что правильно настроил ситуацию, однако результаты всегда ноль.Как использовать два выпадающих меню из той же модели?

Вот три модели:

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

Итак, я успешно добавили данные в FamilyMember и RelationshipType и CRUD работает отлично.

Проблема находится в Create Controller/View FamilyRelationship. Выпадающее меню отлично работает и отображает членов семьи в двух связанных меню, и это соотношение также отображается в раскрывающемся списке relationType. Однако, когда я нажимаю кнопку «Создать», все значения имеют значение «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

@Html.DropDownList("familyMember"

вам нужно использовать фактические имена свойств, скорее всего,

@Html.DropDownList("familyMemberPrimary"

вы также должны переименовать свойство viewbag, чтобы подстать элементы, чтобы показать. ,или использовать dropdownlistfor

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

вам также необходимо добавить DropDownList для 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") 
} 

убедитесь, что вы повторно установить свои свойства после ViewBag сбой POST

DotNetFiddle Example

+0

Это фантастика. Поистине оцените ваши усилия в этом. –

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

EDIT:Согласно комментарию

Значения в пределах FamilyRelationship так familyMemberPrimary, familyMemberSecondary и RelationshipType имеют значение 0, где I ожидал, что идентификатор каждого из них будет передан.

Поскольку вы используете метод EditorFor помощника для familyMemberPrimary собственности на ваш взгляд. Поэтому, если вы не заполняете значение в этом поле ввода, оно будет иметь значение по умолчанию (0 для типа int)

Если вы хотите, чтобы это свойство было заполнено вашим выпадающим списком (членов семьи), вы должны укажите значение выпадающего имени как familyMemberPrimary, так что при отправке формы привязка модели установит выбранное значение параметра в свойство familyMemberPrimary.

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

Это хороший момент, однако это не решает проблему, почему я не получаю никаких значений. Независимо от того, что я выбираю из трех выпадающих меню, результаты составляют 0,0,0, и я не могу получить значения id из каждого выбора. –

+0

Что вы не получаете? Ваш параметр метода действия HttpPost имеет тип 'FamilyRelationship', значение свойства которого не подходит? – Shyju

+0

Значения в 'FamilyRelationship', поэтому' familyMemberPrimary', 'familyMemberSecondary' и' relationshipType' имеют значения 0, где я ожидал, что 'id' каждого из них будут переданы. Я не уверен, где в коде это происходит неправильно. Я знаю, что совершил ошибку, просто не вижу ее. –