如何扩展html.textboxfor以删除name属性?

时间:2012-09-07 03:34:13

标签: asp.net-mvc

我想扩展帮助程序,使其像这样:


@html.TextBoxFor(x=>x.CustomerId).ReadOnly()

并输出不带name属性的input元素,这样它就不会发布到服务器上。

2 个答案:

答案 0 :(得分:3)

这应该可以解决问题:

public static class MyInputExtensions
{
    public static MvcHtmlString NameLessTextBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression)
    {
        var textBox = htmlHelper.TextBoxFor(expression);

        string pattern = @"name=""([^""]*)""";

        string fixedHtml = Regex.Replace(textBox.ToHtmlString(), pattern, "");

        return new MvcHtmlString(fixedHtml);
    } 
}

用法:

@Html.NameLessTextBoxFor(x=> x.CustomerId)

答案 1 :(得分:0)

你做不到。

(至少没有一些丑陋的解决方法,处理从助手返回的字符串值)

HTML帮助程序旨在帮助您为模型生成表单字段,以将数据发送到服务器。对于强类型的助手(例如Html.TextBoxFor(x => x.CustomerId)),其名称取自passed expression;对于非强类型的助手(例如Html.TextBoxFor("CustomerId", Model.CustomerId)),有一个check会在出现以下情况时引发异常:名称为空或空。

如果要生成不带“名称”属性的输入,则只需不要使用html helper 方法。

例如,如果要更改html助手用法以生成相同的输出,但没有“名称”属性,则:

  1. 代替此:
@Html.TextBoxFor(x => x.BetAmount)
  1. 这样写:
<input type="text" value="@Model.BetAmount" />
  1. 代替此:
@Html.TextBoxFor(x => x.BetAmount, new { @class = "red", placeholder = "Type Stuff", data_maximum_value = Model.MaximumBetAmount })
  1. 这样写:
<input type="text" value="@Model.BetAmount" class="red" placeholder="Type Stuff" data_maximum_value="@Model.MaximumBetAmount" />
  1. 代替这个(您可以在“ format”参数中使用重载):
@Html.TextBoxFor(x => x.BetAmount, "{0:0}", new { @class = "blue" })
  1. 这样写:
<input type="text" value="@Html.FormatValue(Model.BetAmount,"{0:0}")" class="red" />

因为当您传递“格式”参数时,Html.TextBoxFor uses Html.FormatValue

这与html helper的操作并不完全相同,因为html helper首先尝试从ModelState获取数据以进行验证(这是common gotcha)。但是对于99%的时间来说,这可能已经足够了

如果您想知道辅助方法实际上在做什么,我建议检查ASP.NET MVC的实际source code。这不是黑魔法。