2016-01-11 3 views
0

предположим, что это мои классы модели представления.ASP.Net MVC: как связать выпадающее меню с глубоким вложенным свойством

public class MainViewModel 
{ 
    public List<Student> Students { get; set; } 
    public int SelectedState = 0; 

} 

public class Student 
{ 
    public int ID = 0; 
    public string Name = ""; 
    public int StateID = 0; 
    public List<States> States { get; set; } 

} 

public class States 
{ 
    public int ID = 0; 
    public string Name = ""; 
} 

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

@Html.DropDownListFor(x => x.SelectedState new SelectList(Model.Students.States, "ID", "Name", Model.SelectedState), "-- Select States--", new { id = "cboState", @class = "edit-mode" }) 

это не работает SelectList(Model.Students.States, "ID", "Name", Model.SelectedState), как передать этот Model.Students.States

пожалуйста, обсудить этот вопрос с образцом кода. каждый студент имеет отношение к состояниям.

+0

пытается использовать расширение SelectMany LINQ Model.Students.SelectMany (х => x..States) –

+0

подтвердите этот код будет работать ' @ Html.DropDownListFor (x => x.SelectedState new SelectList (Model.Students.SelectMany (x => x.States), "ID", "Name", Model.SelectedState), "- Select States--", new {id = "cboState", @class = "edit-mode"}) '? – Mou

+2

Я сомневаюсь, правильно ли построена ваша модель, почему объект 'Student' должен иметь' List '? можете ли вы рассказать нам, каково ваше фактическое требование, чтобы мы могли предложить решение? – ramiramilu

ответ

1

Проверьте это:

@Html.DropDownListFor(x => x.SelectedState, new SelectList(Model.Students.FirstOrDefault().States, "ID", "Name", Model.SelectedState), "-- Select States--", new { id = "cboState", @class = "edit-mode" }) 

Но лучше, чтобы сохранить Штаты Список в ViewBag в контроллере:

ViewBag.States = (_context or _serviceLayer).(States or GetStates()).Select(s => new SelectListItem { Value = s.ID, Text = s.Name, Selected = s.ID == viewModel.SelectedState }).ToList(); 

А на Вид:

@Html.DropDownListFor(x => x.SelectedState, (List<SelectListItem>)ViewBag.States, "-- Select States--", new { id = "cboState", @class = "edit-mode" }) 

ЗАЯВЛЕННОЙ EDIT:

Модель:

namespace MyProject.Models 
{ 
    public class ViewInfo 
    { 
     public int StateID { get; set; } 
    } 

    public class Student 
    { 
     public int ID { get; set; } 
     public string FullName { get; set; } 
     public int StateID { get; set; } 
    } 
    public class State 
    { 
     public int ID { get; set; } 
     public string Name { get; set; } 
    } 
} 

контроллеры:

using MyProject.Models; 
namespace MyProject.Controllers 
{ 
    public class StudentsController : Controller 
    { 
     private MyDBEntities _context; 

     public StudentsController() 
     { 
      this._context = new MyDBEntities(); 
     } 

     // StudentsController 
     public ActionResult Index() 
     { 
      ViewBag.ViewInfo = new ViewInfo { StateID = 1 }; 
      ViewBag.StateID = _context.States.Select(s => new SelectListItem { Value = s.ID, Text = s.Name }).ToList(); 
      return View(_context.Students.ToList()); 
     } 
     [HttpPost] 
     [ValidateAntiForgeryToken] 
     public ActionResult Index(ViewInfo viewInfo) 
     { 
      ModelState.Clear(); 

      ViewBag.ViewInfo = viewInfo; 
      ViewBag.StateID = _context.States.Select(s => new SelectListItem { Value = s.ID, Text = s.Name, Selected = s.ID == viewInfo.StateID }).ToList(); 
      return View(_context.Students.Where(s => s.StateID == viewInfo.StateID).ToList()); 
     } 
    } 
} 

А Вид:

@using MyProject.Models; 
@model IEnumerable<MyProject.Models.Student> 

@{ 
    ViewBag.Title = "Students"; 
    ViewInfo viewInfo = ViewBag.ViewInfo; 
} 

<div class="page-header"> 
    <h2>Students</h2> 
</div> 

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

    @Html.DropDownList("StateID", null, new { @class = "form-control" }) 

    <input type="submit" value="Filter" class="btn btn-primary" /> 

    // Students Table 
} 
+0

хотел бы немного помочь. пожалуйста, посмотрите модель просмотра и опубликуйте новые классы моделей представлений, которые, по вашему мнению, были бы правильными. – Mou

+0

ОК, один момент. – QuietNaN

+0

ответить на этот пост скорее дать ответ на этот пост http://stackoverflow.com/questions/34709891/asp-net-mvc-how-to-bind-dropdown-list-with-nested-list-type-property? noredirect = 1 # comment57181291_34709891 – Mou

Смежные вопросы