2013-06-05 17 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") 

注意lambda表達式?該框架並沒有實際執行它;相反,它會將其解析爲元數據並使用它來獲取該項目的完全限定名稱。這可以用來從原始屬性中檢索各種信息,例如與驗證相關的DataAnnotations

執行的關鍵是private static MvcHtmlString SelectInternal(...),包含在System.Web.Mvc.Html.SelectExtensions中。值得注意的是與模型狀態和驗證的整合。

+2

感謝您的詳細回答。 –

+0

社區留言給你更多的選票。 –

相關問題