【问题标题】:ASP.NET MVC 3: Override "name" attribute with TextBoxForASP.NET MVC 3:使用 TextBoxFor 覆盖“名称”属性
【发布时间】:2011-08-28 19:25:19
【问题描述】:

使用Html.TextBoxFor覆盖name属性时是否可以?

我试过没有成功。我需要使用 TextBoxFor 来进行客户端验证,但是由于我不会进入的原因,我需要文本框的名称与生成的名称不同。

我尝试了以下方法:

@Html.TextBoxFor(x => x.Data, new { name = Model.Key + "_Data", id = Model.Key + "_Data" })

这适用于 ID 但不适用于名称。这可能吗?

更新:查看 TextBoxFor 的代码。看起来没有简单的方法。希望有人能证明我错了。

【问题讨论】:

标签: c# asp.net-mvc-3 razor html-helper


【解决方案1】:

有点“不漂亮”=),试试:

@Html.TextBoxFor(x => x.Data).ToString().Replace("Data", "NewData")

【讨论】:

  • 似乎是一个不错的简单方法。如果有点 hacky :-)
  • 嗯,这样,你不会宁愿只使用普通的 Html.TexBox.. 因为替换后任何静态类型都消失了
【解决方案2】:

试试EditorFor。如果要确保即使属性类型不是字符串也能呈现文本框,可以将字符串作为模板名称传递。如果属性已经是字符串,则不需要templatename 显式呈现文本框,因此您可以传递null。请注意,它不需要显式的 id 参数,它会从元素名称中推断出来。 EditorFor 的所有验证内容仍然有效

 @Html.EditorFor(x => x.Data, "string", Model.Key + "_Data")

【讨论】:

    【解决方案3】:

    您问这个是因为您想为名称应用前缀吗?如果是这样,您可以通过在 Controller 中设置 ViewData.TemplateInfo.HtmlFieldPrefix 来做到这一点。

    我从 Brad Wilson's blog 那里学到了很多关于这些东西的知识。

    【讨论】:

    • 这看起来像赢家!漂亮。
    • 是的,他们把那个藏得很好,不是吗:)
    • 这只是让我省去了一些头痛和代码重复。
    【解决方案4】:

    本的回答让我得到了我想要的东西,除了你需要用 Html.Raw 包装

    @Html.Raw(Html.TextBoxFor(x => x.Data).ToString().Replace("Data", "NewData"))
    

    【讨论】:

      【解决方案5】:

      Rob,其实有一个更简单的方法。使用 Name 代替 name

      @Html.TextBoxFor(x => x.Data, new { Name = Model.Key + "_Data", id = Model.Key + "_Data" })
      

      【讨论】:

      • 区分大小写的是@highwingers,这个小细节有可能节省时间。
      • Overkill.. Name but id X_X
      • 很奇怪,“id”不区分大小写(适用于 Id 和 id)但“name”不区分大小写。
      • 对于 ASP.NET 4,提供 Name 会产生两个属性,Namename,并且模型绑定器使用 name
      • 但是处理两个名称只是大小写不同的属性是维护噩梦的秘诀.....
      【解决方案6】:

      EditorFor 有一个重载,您可以在其中提供name 属性作为参数:

       @Html.EditorFor(expression, null, name)
      

      【讨论】:

      • 如果我在几个小时前找到这个会节省我几个小时的时间,哈哈
      • 很有趣,但是对于像 DropDownListFor 这样的类似帮助程序的名称属性没有重载,您必须在 html 属性参数中指定它(名称中带有大写 N)。
      【解决方案7】:

      对我来说,它有效!希望对您有所帮助!

      @Html.EditorFor(model => model.Nome, new { htmlAttributes = new { @class = "form-control", @maxlength = "80", @id = "NomeFilter", @Name = "NomeFilter" } })
      

      【讨论】:

        【解决方案8】:

        它叫微软GOTCHA...

        使用大写的名称,像这样

        @Html.TextBoxFor(m => m.Reply.Answer, new { Name = "Whatyouwant" })
        

        【讨论】:

        • 这真的很重要,如果你使用@name,它不会被覆盖。很难弄清楚。谢谢
        【解决方案9】:
        @Html.EditorFor(Model => Model.Something, "name", "name", new {@class = "form-control" })
        

        不确定中间的这两个字符串参数中的哪一个起作用,但只有在我同时键入它们时才起作用。

        【讨论】:

        • 这是 ID 和名称。这对我有用。我浏览了上述所有答案,但没有一个有效,但这 1. 谢谢。
        • public static MvcHtmlString EditorFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, string templateName, string htmlFieldName, object additionalViewData);。不知道templateName 应该是什么,所以我使用了null。对于htmlFieldName,我使用了参数的名称(在我的例子中是“ipmi”而不是“IPMI”)。这对我有用。
        【解决方案10】:

        对于这个例子,我根据权限禁用了表单字段,但仍然显示它们。我有一个隐藏字段来将值发送到控制器,但想要在 EditorFor 中使用不同的字段名称。 模型值后的第一个参数代表“名称”属性,第二个是新名称。

        @Html.EditorFor(m => m.UserName, "name", "UserNameDisabled", new { htmlAttributes = new { @class = "form-control", @disabled = "disabled"} });
        

        结果:

        <input class="form-control text-box single-line" disabled="disabled" id="UserNameDisabled" name="UserNameDisabled" type="text" value="someEnteredValue" /> 
        

        【讨论】:

          【解决方案11】:

          保持简单,您已经提供了 ID,您应该能够使用方法“TextBox”而不是“TextBoxFor”,它可以在客户端和服务器端正常工作。此外,虽然接受的答案会起作用,但如果您使用浏览器检查它,则会在您的标签上产生重复的 Name 属性。下面的解决方案没有这个问题。

          MvcHtmlString Html.TextBox(字符串名称,字符串值,对象htmlAttributes)

          @Html.TextBox(Model.Key + "_Data", Model.Key, new { id = Model.Key + "_Data" }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-12-14
            • 1970-01-01
            • 2011-06-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多