2011-01-28 17 views
0

私はこれに答えて他の投稿を見ましたが、私のために働くことはできません。これは私のcontroller-である>選択リストに項目を書式設定

私はDBから戻ってきた日にフォーマットを適用することができるようにしたい
ViewData["TARGET_DATE"] = new SelectList((from n in _db.ACTION_PLANs select n).ToList(), "TARGET_DATE", "TARGET_DATE"); 

は、私の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

+0

それはかなり簡潔ですね? :) – jpolete

0

上記のクラスを実装した方法は次のとおりです。私のクライアントは、開始時刻と終了時刻を含む2つのドロップダウンリストを探していました。 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> 
関連する問題