0

私の MVC アプリケーションでは、モデルから列挙型を取得し、その型の他のすべての使用可能な列挙型のラジオ ボタンを表示するヘルパーを作成しました。

たとえば、 enum Satus がありActive, Inactive, Closed、ページのモデルが持つため、およびのStatus = Status.Activeラジオ ボタンを表示したいとします。InactiveClosed

この例を進めると、MVC ビューはヘルパー RadioButtonForEnum を呼び出します。

@Html.RadioButtonForEnum(model => model.Status)

RadioButtonForEnum は、そのタイプのすべての Enum のリストを取得し、それらをラジオ ボタンとして出力します。ただし、それを除外するために渡された列挙型に到達する方法がわかりませんnames

public static MvcHtmlString RadioButtonForEnum<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression)
{
    var metaData = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
    var names = Enum.GetNames(metaData.ModelType);
    var sb = new StringBuilder();
    foreach (var name in names)
    {
        var id = string.Format(
            "{0}_{1}_{2}",
            htmlHelper.ViewData.TemplateInfo.HtmlFieldPrefix,
            metaData.PropertyName,
            name
        );

        var radio = htmlHelper.RadioButtonFor(expression, name, new { id = id }).ToHtmlString();
        sb.AppendFormat("<label for=\"{1}\">{0}{2}</label>", radio, id, HttpUtility.HtmlEncode(StringHelpers.PascalCaseToSpaces(name)));
    }

    return MvcHtmlString.Create(sb.ToString());
}
4

4 に答える 4

0

Quick and dirty way:

foreach (var name in names)
{
    if (name == metaData.Model.ToString())
        continue;

    ...
}
于 2013-08-16T20:57:58.983 に答える
0

私は自分のコンピューターを持っていないため、ここでは完全にテストされていませんが、署名を次のように変更するのはどうでしょうか。

public static MvcHtmlString RadioButtonForEnum<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, Enum Status)

これにより、Status 列挙型を渡し、その値を問い合わせることができます。

public static MvcHtmlString RadioButtonForEnum<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, Enum Status){
        var metaData = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
        var names = Enum.GetNames(metaData.ModelType);
        var sb = new StringBuilder();
        foreach (var name in names)
        {
            if (!name.Equals(Status.ToString()){
            var id = string.Format(
                "{0}_{1}_{2}",
                htmlHelper.ViewData.TemplateInfo.HtmlFieldPrefix,
                metaData.PropertyName,
                name
        );

        var radio = htmlHelper.RadioButtonFor(expression, name, new { id = id }).ToHtmlString();
        sb.AppendFormat("<label for=\"{1}\">{0}{2}</label>", radio, id, HttpUtility.HtmlEncode(StringHelpers.PascalCaseToSpaces(name)));
        }
}

そして、次のようにビューから呼び出します。

@Html.RadioButtonForEnum(model => model.Status, Model.Status)
于 2013-08-16T21:14:21.387 に答える