2013-06-05 2 views
2

Мой код контроллераКак работает следующий код в mvc3?

public ActionResult Create(string id) 
    { 
     ViewBag.ALLO_ID = new SelectList(_unitOfWork.AllocationMRepository.Get(), "ALLO_ID", "ALLO_ID", id); 
     ViewBag.TERR_ID = new SelectList(_unitOfWork.TerrListRepository.Get().OrderBy(m => m.TERR_ID), "TERR_ID", "TERR_ID"); 
     ViewBag.ITEM_ID = new SelectList(_unitOfWork.SampleInfo.Get(), "ITEM_ID", "ITEM_ID"); 
     return View(); 
    } 

На мой взгляд

<div class="editor-field"> 
       @Html.DropDownList("ALLO_ID", String.Empty) 
       @Html.ValidationMessageFor(model => model.ALLO_ID) 
      </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.TERR_ID, "Territory Name") 
     </div> 
     <div class="editor-field"> 
      @Html.DropDownList("TERR_ID", String.Empty) 
      @Html.ValidationMessageFor(model => model.TERR_ID) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.ITEM_ID, "Item Name") 
     </div> 
     <div class="editor-field"> 
      @Html.DropDownList("ITEM_ID", String.Empty) 
      @Html.ValidationMessageFor(model => model.ITEM_ID) 
     </div> 

Как эти списки падения капли создаются? Мне это не очень понятно. Я хочу знать, как это работает. Это может быть вопрос с дерьмом, но мне любопытно узнать, как я начинаю.

Спасибо в продвижении.

ответ

2

Grab the source и построить его на вашей машине. Шутки в сторону. Я часто ссылаюсь на свою копию.

Чтобы ответить на ваш конкретный вопрос, то есть «как вы создаете раскрывающиеся списки?» Он выполняет итерацию через перечислимую коллекцию и создает строку.

Библиотеки MVC определяют многочисленные методы расширения для класса HtmlHelper. Вы можете легко определить свои собственные. Конечно, вы можете создавать другие вспомогательные классы, но HtmlHelper легко доступен только для этой цели.

шагая через несколько слоев перегрузок, мы находим:

private IHtmlString BuildDropDownList(string name, string defaultOption, IEnumerable<SelectListItem> selectList, 
      object selectedValue, IDictionary<string, object> htmlAttributes) { 

    var modelState = ModelState[name]; 
    if (modelState != null) { 
     selectedValue = selectedValue ?? ModelState[name].Value; 
    } 
    selectedValue = ConvertTo(selectedValue, typeof(string)); 

    if (selectedValue != null) { 
     var newSelectList = new List<SelectListItem>(from item in selectList select new SelectListItem(item)); 
     var comparer = StringComparer.InvariantCultureIgnoreCase; 
     var selectedItem = newSelectList.FirstOrDefault(item => item.Selected || comparer.Equals(item.Value ?? item.Text, selectedValue)); 
     if (selectedItem != default(SelectListItem)) { 
      selectedItem.Selected = true; 
      selectList = newSelectList; 
     } 
    } 

    TagBuilder tagBuilder = new TagBuilder("select") { 
     InnerHtml = BuildListOptions(selectList, defaultOption) 
    }; 
    tagBuilder.MergeAttributes(htmlAttributes); 
    tagBuilder.MergeAttribute("name", name, replaceExisting: true); 
    tagBuilder.GenerateId(name); 

    // If there are any errors for a named field, we add the css attribute. 
    AddErrorClass(tagBuilder, name); 

    return tagBuilder.ToHtmlString(TagRenderMode.Normal); 
} 

Это действительно не так уж сложно. Методы расширения, которые используют суффикс «For», немного сложнее.

@Html.LabelFor(model => model.TERR_ID, "Territory Name") 

Обратите внимание на выражение лямбда? Фреймворк фактически не выполняет его; вместо этого он анализирует его как метаданные и использует его для получения полностью квалифицированного имени элемента. Затем это можно использовать для извлечения различной информации из исходного свойства, например DataAnnotations, относящегося к валидации.

Суть реализации: private static MvcHtmlString SelectInternal(...), содержащаяся в System.Web.Mvc.Html.SelectExtensions. Следует отметить интеграцию с состоянием модели и валидацией.

+2

спасибо за ур подробный ответ. –

+0

Сообщество крик дать больше голосов. –

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