4

我想扩展 helper 使它像这样:


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

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

4

2 回答 2

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)
于 2012-09-07T07:38:53.553 回答
0

你不能这样做。

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

编写 Html 帮助程序是为了帮助您为模型生成表单字段,目的是它们会将数据发送到服务器。对于强类型助手(如Html.TextBoxFor(x => x.CustomerId)),名称取自传递的表达式,对于非强类型助手(如Html.TextBoxFor("CustomerId", Model.CustomerId)),当名称为空或为空时,检查会引发异常。

如果您想生成没有“名称”属性的输入,那么就不要使用 html 辅助方法。

例如,如果您想更改 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. 而不是这个(你使用带有“格式”参数的重载):
@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 使用。 Html.FormatValue

这与 html 助手所做的并不完全相同,因为 html 助手首先尝试从 ModelState 获取数据以进行验证(这是一个常见的陷阱)。但在 99% 的情况下,这可能就足够了

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

于 2020-10-19T16:02:38.100 回答