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>

各日付をループしてフォーマットする方法、またはそれらすべてにフォーマットを適用する方法があるかどうかを誰かが知っていますか?または、これを行うための最良の方法は何でしょうか。提供できるコードがさらに必要な場合、本当に必要なのは、時刻なしで日付を表示することです。前もって感謝します。

4

2 に答える 2

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;
    }

}
于 2011-11-16T20:18:52.230 に答える
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>
于 2013-04-19T18:55:56.693 に答える