Как безопасно отображать список <SelectListItem> в SelectList

Я задал вопрос, где OP имеет что-то вроде этого

[HttpGet]
public  ActionResult Index() {
   var options = new List<SelectListItem>();

   options.Add(new SelectListItem { Text = "Text1", Value = "1" });
   options.Add(new SelectListItem { Text = "Text2", Value = "2" });
   options.Add(new SelectListItem { Text = "Text3", Value = "3" });

   ViewBag.Status = options;

   return View();
}

И тогда в представлении было возможно сделать что-то вроде этого

@Html.DropDownList("Status", ViewBag.Status as SelectList)

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

Мой вопрос: как это делается, когда сделано в представлении, List<SelectListItem> безопасно передает в SelectList

Ответ 1

Это был хороший вопрос. Я рассмотрел вопрос дальше и, действительно, если параметр selectList равен нулю, то параметр name используется для поиска ключа в ViewData.

Я основываю это на http://aspnetwebstack.codeplex.com/SourceControl/changeset/view/5cb74eb3b2f3#src/System.Web.Mvc/Html/SelectExtensions.cs

Они даже добавили комментарий:

private static MvcHtmlString SelectInternal(this HtmlHelper htmlHelper, ModelMetadata metadata, string optionLabel, string name, IEnumerable<SelectListItem> selectList, bool allowMultiple, IDictionary<string, object> htmlAttributes)
{
    ...
    // If we got a null selectList, try to use ViewData to get the list of items.
    if (selectList == null)
    {
       selectList = htmlHelper.GetSelectData(name);
       ...

И далее используется name:

private static IEnumerable<SelectListItem> GetSelectData(this HtmlHelper htmlHelper, string name)
{
    object o = null;
    if (htmlHelper.ViewData != null)
    {
        o = htmlHelper.ViewData.Eval(name);
    }
    ...

Хороший вопрос @Нкоси. Я понятия не имел, что это возможно.