2016-05-16 3 views
0

Мне нужна помощь в решении этой проблемы. Я пробовал несколько вещей, но я никуда не уйду. Вот моя проблема: я хочу использовать dropdownlist с таблицей, которую я создал с EF в MVC 5. dropdownlist содержит ContactGroups, созданный пользователем. Этот dropdownlist изменится в зависимости от уникальных значений в моей базе данных. Когда я выбираю между ContactGroups в dropdownlist, я хочу, чтобы в таблице отображались только контакты, принадлежащие выбранному ContactGroup. Например: если я нажимаю «Друзья» в dropdownlist, я хочу, чтобы в таблице отображались только контакты с ContactGroup значением «Друзья».DropDownList для фильтрации таблицы MVC 5

Мой вопрос: Каков наилучший способ реализовать это? Как я могу получить значение, выбранное в DropDownList? Лучше ли пересылать это значение обратно контроллеру и отфильтровывать контакты? Должен ли я использовать Частичные виды?

Посмотреть

@model PagedList.IPagedList<Webassistent.Models.ContactModel> 
 
@using PagedList.Mvc; 
 

 
<link href="~/Content/PagedList.css" rel="stylesheet" type="text/css" /> 
 

 
@{ 
 
    ViewBag.Title = "Contacts"; 
 
} 
 

 
<h2>Contacts</h2> 
 

 
@Html.DropDownList("CG", 
 
(@ViewBag.Groups) as IEnumerable<SelectListItem>, "Select Group", 
 
new { htmlAttributes = new { @class = "form-control" } }) 
 

 

 
<p> 
 
    @Html.ActionLink("Create New", "Create") 
 
</p> 
 

 
@using (Html.BeginForm("Index", "Contact", FormMethod.Get)) { 
 
    <p> 
 
    Find by name: @Html.TextBox("SearchString", ViewBag.CurrentFilter as string) 
 
    <input type="submit" value="Search" /> 
 
    </p> 
 
} 
 
<table class="table"> 
 
    <tr> 
 
     <th> 
 
     First Name 
 
     </th> 
 
     <th> 
 
     @Html.ActionLink("Last Name", "Index", new { sortOrder = ViewBag.NameSortParm, currentFilter=ViewBag.CurrentFilter }) 
 
     </th> 
 
     <th> 
 
     Private Phone 
 
     </th> 
 
     <th> 
 
     Private Email 
 
     </th> 
 
     <th> 
 
     @Html.ActionLink("ContactGroup", "Index", new { sortOrder = ViewBag.GroupSortParm, currentFilter = ViewBag.CurrentFilter }) 
 
     </th> 
 
     <th></th> 
 
    </tr> 
 

 
    @foreach (var item in Model) { 
 
    <tr> 
 
     <td> 
 
     @Html.DisplayFor(modelItem => item.FirstName) 
 
     </td> 
 
     <td> 
 
     @Html.DisplayFor(modelItem => item.LastName) 
 
     </td> 
 
     <td> 
 
     @Html.DisplayFor(modelItem => item.PrivatePhone) 
 
     </td> 
 
     <td> 
 
     @Html.DisplayFor(modelItem => item.PrivateEmail) 
 
     </td> 
 
     <td> 
 
     @Html.DisplayFor(modelItem => item.ContactGroup) 
 
     </td> 
 
     <td> 
 
     @Html.ActionLink("Edit", "Edit", new { id=item.ContactId }) | @Html.ActionLink("Details", "Details", new { id=item.ContactId }) | @Html.ActionLink("Delete", "Delete", new { id=item.ContactId }) 
 
     </td> 
 
    </tr> 
 

 
</table> 
 

 
<br />Page @(Model.PageCount 
 
< Model.PageNumber ? 0 : Model.PageNumber) of @Model.PageCount @Html.PagedListPager(Model, page=>Url.Action("Index", new { page, sortOrder = ViewBag.CurrentSort, currentFilter = ViewBag.CurrentFilter}))

Контроллер

[Authorize] 
    public ActionResult Index(string sortOrder, string currentFilter, string searchString, int? page) 
    { 
     ViewBag.CurrentSort = sortOrder; 
     ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? "name_desc" : ""; 
     ViewBag.GroupSortParm = sortOrder == "Group" ? "group_desc" : "Group"; 

     if (searchString != null) 
     { 
      page = 1; 
     } 
     else 
     { 
      searchString = currentFilter; 
     } 
     ViewBag.CurrentFilter = searchString; 

     string thisUser = User.Identity.GetUserId(); 
     var contacts = from s in db.ContactModels where s.UserId == thisUser select s; 

     if (!String.IsNullOrEmpty(searchString)) 
     { 
      contacts = contacts.Where(s => s.LastName.Contains(searchString) || s.FirstName.Contains(searchString) || s.ContactGroup.Contains(searchString)); 
     } 

     switch (sortOrder) 
     { 
      case "name_desc": 
       contacts = contacts.OrderByDescending(s => s.LastName); 
       break; 
      case "Group": 
       contacts = contacts.OrderBy(s => s.ContactGroup); 
       break; 
      case "group_desc": 
       contacts = contacts.OrderByDescending(s => s.ContactGroup); 
       break; 
      default: 
       contacts = contacts.OrderBy(s => s.LastName); 
       break; 
     } 
     int pageSize = 3; 
     int pageNumber = (page ?? 1); 

     var groups = contacts.Where(x => x.ContactGroup !=null).Select(x => x.ContactGroup).Distinct(); 
     ViewBag.Groups = new SelectList(groups); 

     return View(contacts.ToPagedList(pageNumber, pageSize)); 
    } 

Я думал, что я мог бы использовать ViewBag.Groups для того, чтобы следить за ContactGroup с принадлежащим к текущему пользователю. Это используется DropDownList является видом для отображения ContactGroup s.

Я уверен, что есть простой способ сделать это, но я не вижу решения. Любая помощь очень ценится !!

ответ

0
  1. Модель вида для представления, возвращаемого контроллером, который имеет свойство для # 3.
  2. HTML Helper, который находится в папке Views \ Shared.
  3. Объект, который определяет свойства в HTML-помощнике.
  4. В вашем контроллере заполняется объект, который определяет ваш HTML-помощник.
Смежные вопросы