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

Asp.net mvc 如何扩展html.textboxfor以删除name属性?,asp.net-mvc,Asp.net Mvc,我想扩展助手,使其如下所示: @html.TextBoxFor(x=>x.CustomerId).ReadOnly() 然后输出不带name属性的输入元素,这样就不会将其发布到服务器。这应该可以做到: public static class MyInputExtensions { public static MvcHtmlString NameLessTextBoxFor<TModel, TProperty>(this HtmlHelper<TModel> h

我想扩展助手,使其如下所示:


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

然后输出不带name属性的输入元素,这样就不会将其发布到服务器。

这应该可以做到:

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帮助程序是为了帮助您为模型生成表单字段,以便将数据发送到服务器。对于强类型帮助程序(如
Html.TextBoxFor(x=>x.CustomerId)
),名称取自,而对于非强类型帮助程序(如
Html.TextBoxFor(“CustomerId”,Model.CustomerId)
),当名称为null或空时会引发异常

如果要生成不带“name”属性的输入,只需不要使用html帮助程序方法即可

例如,如果要更改html帮助程序的用法以生成相同的输出,但不带“name”属性,则:

  • 与此相反:
  • 写下:
  • 写下:
  • 写下:
  • 
    
    因为当您传递“format”参数时,
    Html.TextBoxFor
    Html.FormatValue

    这与html helper所做的并不完全相同,因为html helper首先尝试从ModelState获取数据以进行验证(这是一个复杂的过程)。但在99%的情况下,这可能已经足够好了


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

    我想指出,该模式不仅捕获name=”“等属性,还捕获data name=“”或以name结尾的任何其他属性,并将其删除。因此,数据名称=“将作为数据-”呈现。我改变了这一点,在图案的开头添加了一个空格。因此,在我的扩展中,模式现在是:字符串模式=@“name=”“([^”“]*)”;因此,这只会点击name=“”,而不会点击data name=“”。希望这能帮助别人。
    @Html.NameLessTextBoxFor(x=> x.CustomerId)
    
    @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" />