Как говорит @AaronShockley, поскольку TextBoxFor()
возвращает MvcHtmlString
, единственным вариантом для разработки стиля «плавного API» для изменения выходных данных будет работа с MvcHtmlString
, возвращаемыми вспомогательными методами.Немного другой способ сделать это, который, я думаю, подходит к тому, что вам нужно, состоит в том, чтобы использовать объект 'строителя свойств', например так:
public class MvcInputBuilder
{
public int Id { get; set; }
public string Class { get; set; }
}
... и настроить такие методы расширения, как этот:
public static MvcHtmlString TextBoxFor<TModel, TProp>(
this HtmlHelper<TModel> htmlHelper,
Expression<Func<TModel, TProp>> expression,
params Action<MvcInputBuilder>[] propertySetters)
{
MvcInputBuilder builder = new MvcInputBuilder();
foreach (var propertySetter in propertySetters)
{
propertySetter.Invoke(builder);
}
var properties = new RouteValueDictionary(builder)
.Select(kvp => kvp)
.Where(kvp => kvp.Value != null)
.ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
return htmlHelper.TextBoxFor(expression, properties);
}
Затем вы можете делать такие вещи в своем представлении:
@this.Html.TextBoxFor(
model => model.Name,
p => p.Id = 7,
p => p.Class = "my-class")
Это дает вам строгую типизацию и интеллектуальный смысл для входных свойств, которые вы можете настроить для каждого метода расширения с помощьюдобавление свойств в соответствующий подкласс MvcInputBuilder.