我想扩展 helper 使它像这样:
@html.TextBoxFor(x=>x.CustomerId).ReadOnly()
并输出不带name属性的input元素,这样就不会发布到服务器。
我想扩展 helper 使它像这样:
@html.TextBoxFor(x=>x.CustomerId).ReadOnly()
并输出不带name属性的input元素,这样就不会发布到服务器。
这应该可以解决问题:
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)
你不能这样做。
(至少没有一些丑陋的解决方法来处理从助手返回的字符串值)
编写 Html 帮助程序是为了帮助您为模型生成表单字段,目的是它们会将数据发送到服务器。对于强类型助手(如Html.TextBoxFor(x => x.CustomerId)
),名称取自传递的表达式,对于非强类型助手(如Html.TextBoxFor("CustomerId", Model.CustomerId)
),当名称为空或为空时,检查会引发异常。
如果您想生成没有“名称”属性的输入,那么就不要使用 html 辅助方法。
例如,如果您想更改 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
使用。 Html.FormatValue
这与 html 助手所做的并不完全相同,因为 html 助手首先尝试从 ModelState 获取数据以进行验证(这是一个常见的陷阱)。但在 99% 的情况下,这可能就足够了
如果您想知道辅助方法实际在做什么,我建议您检查 ASP.NET MVC 的实际源代码。这不是黑魔法。