Псевдонимы имен форм с помощью HtmlHelpers - PullRequest
0 голосов
/ 12 октября 2011

ТЛ; др

Как изменить сгенерированные имена элементов формы, чтобы использовать вместо них псевдонимы из ModelMetadata.AdditionalValues? Желательно с пользовательским (или не пользовательским) помощником html.


У меня есть модель представления поиска с некоторыми пользовательскими свойствами объекта. Каждое свойство идет еще два свойства, на мой взгляд. Я также использую шаблоны редактора на мой взгляд. Моя форма заканчивается следующими элементами:

HTML

<input name="Field1.Field.Id" id="..." type="..." />
<input name="Field1.Field.Label" id="..." type="..." />
<input name="Field2.Field.Id" id="..." type="..." />
<input name="Field2.Field.Label" id="..." type="..." />

Search.spark (.aspx)

${ Html.EditorFor(m => m.Field1) } // Field1 is of type SearchField
${ Html.EditorFor(m => m.Field2) } // Field2 is of type SearchField
etc...

SearchField.spark (.ascx)

<viewdata model="SearchField" />
// *snip*
${ Html.EditorFor(m => m.Field) } // Field is of type SpecialField

SpecialField.spark (.ascx)

<viewdata model="SpecialField" />
${ Html.HiddenFor(m => m.Id) } // Id is of type int?
${ Html.TextBoxFor(m => m.Label } // Label is of type string

Поскольку форма использует GET, я получаю очень длинные строки запроса. То, что я хотел бы сделать, это предоставить псевдонимы для свойств. У меня уже есть атрибут, поставщик метаданных модели для заполнения AdditionalValues и настраиваемый механизм связывания моделей, чтобы позаботиться о псевдонимах, но я застрял при создании правильного html.

Я думал, что просто напишу специальный помощник по html, но застрял довольно быстро.

public static MvcHtmlString HiddenForA<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression)
{
    var metadata =  ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);                

    if (metadata.AdditionalValues.ContainsKey("Alias"))
    {
        string alias = (string)metadata.AdditionalValues["Alias"];

        // what to do now?    
    }
}

1 Ответ

0 голосов
/ 21 октября 2011

У вас есть псевдоним, который вы хотите использовать, значение доступно из metadata.Model, тогда все, что вам нужно сделать, это сгенерировать ваш HTML. Вы можете использовать конструктор тегов, string.format или любой другой, который вы предпочитаете, для удобства чтения я буду использовать string.format и иметь свойства в «а не».

public static MvcHtmlString HiddenForA<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression)
{
    var metadata =  ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);                

    if (metadata.AdditionalValues.ContainsKey("Alias"))
    {
        string alias = (string)metadata.AdditionalValues["Alias"];
        string value = Convert.ToString(value, metadata.Model);

        string html = string.Format(@"<input type='hidden' name='{0}' value='{1}' >", alias, value);    
        return MvcHtmlString.Create(html);
    }
}

Однако это решит только проблему ваших длинных URL-адресов, это будет означать, что привязка вашей модели не будет правильно связывать их с вашими действиями. Для этого вам нужно либо создать пользовательский механизм связывания модели, либо заставить ваше действие создать модель представления со свойствами этих имен, а затем либо создать новый объект нужной модели и заполнить его свойства, либо использовать модель представления как есть.

...