Изменение выражения - PullRequest
       28

Изменение выражения

1 голос
/ 13 сентября 2011

У меня очень короткий вопрос. В mvc есть метод статического расширения

System.Web.Mvc.Html.InputExtensions.HiddenFor(this HtmlHelper<TModel>htmlhelper,Expression<Func<TModel,TProperty>> expression,object htmlAttributes)

Я использую этот метод для создания DropDownList на основе HiddenField.

 public static MvcHtmlString CreateDropDown<TModel, TProperty, TKey, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression, IEnumerable<ObjectData<TKey, TValue>> items, object htmlAttributes)
    {
            var resultVar = System.Web.Mvc.Html.InputExtensions.HiddenFor(helper, expression, htmlAttributes.ToRouteValueDictionary(new { @class = "DropDownInputHidden" }));
            //some other code...
            return resultVar;
    }

А что касается свойства простого типа, то такие HiddenFields легко создавать. В связи с этим я использую это так:

@Html.CreateDropDown(t=>t.SelectedValue,(some items list),(some attributes)) // t.SelectedValue is property of type string

Но теперь я хочу создать много скрытых полей на основе свойства, которое реализует интерфейс IList. Функция должна выглядеть так:

    public static MvcHtmlString CreateDropDown<TModel, TProperty, TKey, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression, IEnumerable<ObjectData<TKey, TValue>> items, object htmlAttributes)
    {
            StringBuilder resultVar =new StringBuilder();
            for (int i = 0; i < items.Count(); i++)
            {
                Expression<Func<TModel,TProperty>> ExpressionThatWillPointTo_i_Element = ???; 
                //ExpressionThatWillPointTo should be "based" on expression that is "pointing" to List<string>;
                resultVar.Append(System.Web.Mvc.Html.InputExtensions.HiddenFor(helper, ExpressionThatWillPointTo_i_Element, htmlAttributes.ToRouteValueDictionary(new { @class = "DropDownInputHidden" })));
            }
            //some other code...
            return MvcHtmlString.Create(resultVar.ToString());
    }

и после этого я смогу вызвать эту модифицированную функцию следующим образом:

@Html.CreateDropDown(t=>t.SelectedManyValues,(some items list),(some attributes)) // t.SelectedManyValuesis property of type List<string>

Так что мне нужно как-то изменить выражение, чтобы получить каждое значение из выражения.

У кого-нибудь есть идеи?

1 Ответ

0 голосов
/ 14 декабря 2012

Это то, что я бы сделал в вашей ситуации, поскольку вы уже разработали CreateDropDown и, возможно, захотите повторно использовать этот код.

Создать частичное представление с именем String.cshtml в Shared/DisplayTemplates

Содержимое этого представления должно быть примерно таким:

@model System.String

@Html.CreateDropDown(x => x, (some items list), (some attributes))

После этого на главном экране можно просто сделать:

@Html.DisplayFor(t => t.SelectedManyValues, (some items list), (some attributes))

Дайте мне знать, если это работает для вас !!!

...