Использование кода помощника для функциональности optgroup в Asp.net MVC - PullRequest
7 голосов
/ 13 января 2012

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

Мое требование простое, и все, что мне нужно, это функциональность optgroup в методе расширения DropDownListFor.Во время поиска я наткнулся на этот ответ и скопировал его как есть в файле с именем MyExtensionClass.cs .

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

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

ViewBag.ParentCategoryId = new SelectList(db.Categories, "Id", "Name");

И это мой код представления

@Html.DropDownListFor(model => model.Product.CategoryId, 
     (IEnumerable<SelectListItem>)ViewBag.CategoryId, "---Choose Category---", 
       new { @class = "required" })  

Пожалуйста, помогите мне обновить это до метода расширения с optgroup.

Ответы [ 2 ]

19 голосов
/ 13 января 2012

Мы используем помощника Сержа Заба для выпадающих оптгрупп. Вот образец:

Модель просмотра:

public class OurViewModel
{
    public int? TypeId { get; set; }
    public IEnumerable<GroupedSelectListItem> GroupedTypeOptions { get; set; }
}

Контроллер:

public ActionResult Add()
{
    var model = new OurViewModel
    {
        // fill with initial values
    };
    PutTypeDropDownInto(model);
    return View(model);
}

[NonAction]
private void PutTypeDropDownInto(OurViewModel model)
{
    model.GroupedTypeOptions = _repos.GetTypes()
        .OrderBy(t => t.Category.EnglishName).ThenBy(t => t.EnglishName)
        .Select(t => new GroupedSelectListItem
        {
            GroupKey = t.Category.RevisionId.ToString(),
            GroupName = t.Category.EnglishName,
            Text = t.EnglishName,
            Value = t.RevisionId.ToString()
        }
    );
}

Вид

@Html.DropDownGroupListFor(m => m.TypeId, Model.GroupedTypeOptions, 
    "[Select a type]")

Обратите внимание, что вы не можете использовать обычный список выбора. Вы должны использовать коллекцию его класса GroupedSelectListItem. Также наше решение не использует viewbag. Выпадающий список строго напечатан на модели представления.

Обновление

Чтобы html-помощник работал в вашем представлении, оно должно быть в состоянии найти его. Вы можете добавить директиву @using в верхней части представления вместе с пространством имен MyExtensionClass.cs или добавить пространство имен в специфичный для представления web.config, например:

<pages pageBaseType="System.Web.Mvc.WebViewPage">
  <namespaces>
    <add namespace="System.Web.Mvc" />
    <add namespace="System.Web.Mvc.Ajax" />
    <add namespace="System.Web.Mvc.Html" />
    <add namespace="System.Web.Routing" />
    <add namespace="Microsoft.Web.Mvc" />
    <add namespace="Namespace.For.MyExtensionClass" />
  </namespaces>
</pages>
3 голосов
/ 16 июня 2016

Это было добавлено в ASP.NET MVC версии 5.2!

Свойство Group в SelectListItem позволяет указывать группу для каждого элемента

Html.DropDownList() и DropDownListFor() сейчасгенерировать optgroup элементов на основе групп, включенных в список элементов.

...