我想扩展帮助程序,使其像这样:
@html.TextBoxFor(x=>x.CustomerId).ReadOnly()
并输出不带name属性的input元素,这样它就不会发布到服务器上。
答案 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助手用法以生成相同的输出,但没有“名称”属性,则:
@Html.TextBoxFor(x => x.BetAmount)
<input type="text" value="@Model.BetAmount" />
@Html.TextBoxFor(x => x.BetAmount, new { @class = "red", placeholder = "Type Stuff", data_maximum_value = Model.MaximumBetAmount })
<input type="text" value="@Model.BetAmount" class="red" placeholder="Type Stuff" data_maximum_value="@Model.MaximumBetAmount" />
@Html.TextBoxFor(x => x.BetAmount, "{0:0}", new { @class = "blue" })
<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。这不是黑魔法。