2011-01-28 62 views
0

我已經看到其他職位的答案,但我不能讓他們中的任何人爲我工作..所以。這是我的控制器 - >格式在選擇列表中的項目

ViewData["TARGET_DATE"] = new SelectList((from n in _db.ACTION_PLANs select n).ToList(), "TARGET_DATE", "TARGET_DATE"); 

我希望能夠對從DB回來的日期應用格式,我DDL看起來像這樣

<td><%=Html.DropDownList("TARGET_DATE", "All")%></td> 

沒有人知道是否有是一種循環和格式化每個日期或將格式應用於所有日期的方法。或者什麼是最好的方法來做到這一點,如果你需要更多的代碼我可以提供,我真正想要的是顯示日期沒有時間與它。提前致謝。

回答

2

我知道這篇文章已經過時了,但是我在搜索同一問題的答案時遇到了這個問題。我最終編寫了一個FormattableSelectList類,它將格式字符串作爲參數,然後格式化選擇列表的輸出。這裏有一個如何使用它的例子。

@Html.DropDownFor(
    o => o.SomeProperty, 
    new FormattableSelectList(ViewBag.MyItems, "ID", "Time", "{0:f}"), 
    "Choose a Time" 
) 

我在http://www.jpolete.me/2011/11/16/a-formattable-selectlist-for-net-mvc/寫了一篇關於它的短文。這是它的代碼。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using System.Collections; 
using System.Web.UI; 
using System.Globalization; 

public class FormattableSelectList : SelectList 
{ 
    private string _FormatString; 

    public FormattableSelectList(IEnumerable items, string dataValueField, string dataTextField, string formatString) 
     : base(items, dataValueField, dataTextField) 
    { 
     _FormatString = formatString; 
    } 

    public FormattableSelectList(IEnumerable items, string dataValueField, string dataTextField, string formatString, object selectedValue) 
     : base(items, dataValueField, dataTextField, selectedValue) 
    { 
     _FormatString = formatString; 
    } 

    public override IEnumerator<SelectListItem> GetEnumerator() 
    { 
     return ((!String.IsNullOrEmpty(DataValueField)) ? 
      GetListItemsWithValueField() : 
      GetListItemsWithoutValueField()).GetEnumerator(); 
    } 

    private IList<SelectListItem> GetListItemsWithValueField() 
    { 
     HashSet<string> selectedValues = new HashSet<string>(StringComparer.OrdinalIgnoreCase); 
     if (SelectedValues != null) 
     { 
      selectedValues.UnionWith(from object value in SelectedValues select Convert.ToString(value, CultureInfo.CurrentCulture)); 
     } 

     var listItems = from object item in Items 
         let value = Eval(item, DataValueField, null) 
         select new SelectListItem 
         { 
          Value = value, 
          Text = Eval(item, DataTextField, _FormatString), 
          Selected = selectedValues.Contains(value) 
         }; 
     return listItems.ToList(); 
    } 

    private IList<SelectListItem> GetListItemsWithoutValueField() 
    { 
     HashSet<object> selectedValues = new HashSet<object>(); 
     if (SelectedValues != null) 
     { 
      selectedValues.UnionWith(SelectedValues.Cast<object>()); 
     } 

     var listItems = from object item in Items 
         select new SelectListItem 
         { 
          Text = Eval(item, DataTextField, _FormatString), 
          Selected = selectedValues.Contains(item) 
         }; 
     return listItems.ToList(); 
    } 

    private static string Eval(object container, string expression, string formatString) 
    { 
     object value = container; 
     if (!String.IsNullOrEmpty(expression)) 
     { 
      value = DataBinder.Eval(container, expression); 
     } 
     string stringValue; 
     if (formatString == null) 
     { 
      stringValue = Convert.ToString(value, CultureInfo.CurrentCulture); 
     } 
     else 
     { 
      stringValue = String.Format(formatString, value); 
     } 

     return stringValue; 
    } 

} 
+0

我喜歡這個解決方案http://stackoverflow.com/a/2758784/516690 – Vadim 2014-09-18 17:13:09

0

這裏是我如何實現上面的類。我的客戶正在尋找兩個包含開始時間和結束時間的下拉列表。在MVC4

型號:

[Display(Name = "Time (From):")]   
    public int FromTimeId { get; set; } 

    [Display(Name = "Time (To):")]   
    public int ToTimeId { get; set; } 

    public virtual FromTime FromTime { get; set; } 
    public virtual ToTime ToTime { get; set; }  

控制器:

public ActionResult Create() 
    {   
     ViewBag.FromTimes = db.FromTimes; 
     ViewBag.ToTimes = db.ToTimes; 
    } 

查看:

<div class="editor-field"> 
         @Html.DropDownListFor(model => model.FromTimeId, new Namespace.FormattableSelectList(ViewBag.FromTimes, "FromTimeId", "FromTimeName", "{0:h:mm tt}"))<br />       
         @Html.ValidationMessageFor(model => model.FromTimeId) 
        </div> 
       </td> 
       <td> 
        <div class="editor-label"> 
         @Html.LabelFor(model => model.ToTimeId, "To Time:") 
        </div> 
        <div class="editor-field"> 
         @Html.DropDownListFor(model => model.ToTimeId, new Namespace.FormattableSelectList(ViewBag.ToTimes, "ToTimeId", "ToTimeName", "{0:h:mm tt}"))<br />       
         @Html.ValidationMessageFor(model => model.ToTimeId) 
        </div>