【问题标题】:How do I add placeholder text from the model into a MVC view?如何将模型中的占位符文本添加到 MVC 视图中?
【发布时间】:2014-04-02 02:02:36
【问题描述】:

我有一个模型:

[DataType(DataType.EmailAddress)]
[DisplayFormat(ConvertEmptyStringToNull = true)]
[Display(Prompt = "Email Address")]
public string Email { get; set; }

我正在尝试让“提示”显示在结果文本框的占位符文本中,其中包含以下内容:

@Html.EditorFor(model => model.Email, 
new { htmlAttributes = new { @class = "form-control input-md",
placeholder = @ViewData.ModelMetadata.Watermark } })

当我查看生成的 HTML 时,我只会在输入标签中看到“占位符”。根据我读过的 ViewData.ModelMetadata.Watermark 应该可以工作。获取此占位符文本的正确方法是什么?

【问题讨论】:

  • 这种事情可以通过 [UIHint] 和自定义模板来完成 - 请参阅 this answer 以解决类似的问题。

标签: asp.net-mvc html


【解决方案1】:

这解决了我的问题:

@Html.EditorFor(model => model.Email, new { htmlAttributes = 
new { @class = "form-control input-sm", 
placeholder = @Html.DisplayNameFor(m=>m.Email) } })

执行此操作的代码是

placeholder = @Html.DisplayNameFor(m=>m.Email) 

【讨论】:

  • 但是当我使用 DisplyName 和 Display 属性时,一个用于标签,另一个用于占位符,那么我在 DisplayName 中定义的名称和占位符显示相同
  • 这将双重转义显示名称 - “电子邮件”没有问题,但如果您显示带有重音符号(法语)的文本,这将是一个问题。
【解决方案2】:

有点晚了,但如果有人还在找它...

@Html.EditorFor(model => model.Email, 
new { htmlAttributes = new { @class = "form-control input-md",
@placeholder = "Whatever you want as a placeholder" } })

完美又干净!

【讨论】:

  • 这对我有帮助,并且可以在经过测试的浏览器(Firefox、Chrome、Edge 和 IE11)中运行
【解决方案3】:

在非模板控制上下文中获取Prompt 值而不是DisplayName 的正确解决方案如下:

@Html.EditorFor(model => model.Email, 
    new { @class = "form-control input-md",
    placeholder = ModelMetadata.FromLambdaExpression(m => m.Email, ViewData).Watermark
})

这也将 - 与使用 @Html.DisplayNameFor(m=>m.Email) 的公认解决方案不同 - 双重转义水印文本,这取决于文本和显示的语言可能是一个问题。

【讨论】:

    【解决方案4】:

    使用文本框:

    @Html.TextBoxFor(m => m.Email, new { @class = "form-control", @placeholder = Html.DisplayNameFor(m => m.Email) })
    

    【讨论】:

    • 您的解决方案无法在所有浏览器中运行(在 Firefox、Edge 和 IE11 中测试)
    • 你带来了什么新的,你的解决方案和接受的答案一样。
    【解决方案5】:
    @Html.TextBoxFor(m => m.Email, new { @class = "form-control" , @placeholder = "Username" })
    

    【讨论】:

      【解决方案6】:

      我知道,我有点晚了,但是像这样的扩展方法是最好的解决方案恕我直言:

      public static string UnencodedDisplayNameFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)
      {
          var displayName = html.DisplayNameFor(expression).ToString();
          var unencodedDisplayName = HttpUtility.HtmlDecode(displayName);
      
          return unencodedDisplayName;
      }
      

      用法:

      @Html.EditorFor(model => model.Email, new
      {
          htmlAttributes = new
          {
              @class = "form-control input-sm",
              placeholder = Html.UnencodedDisplayNameFor(m => m.Email) 
          }
      })
      

      此解决方案不会增加复杂性(如使用 ModelMetadata)或重复标签(如其他一些答案),并提供对重音的全面支持。

      【讨论】:

        【解决方案7】:

        像这样使用 TextBoxFor:

         @Html.TextBoxFor(model => model.LastName, new{placeholder="Last Name"})
        

        【讨论】:

          【解决方案8】:

          在呈现视图的控制器方法中说

          ViewData["Name"] = "blabbity blah";

          然后

          @Html.TextBoxFor(u =&gt; u.Company, new { @placeholder = @ViewData["Name"] })

          实际上更好,但你可以做到这一点。

           public ActionResult Index()
              {              
                    NewLogin n = new ClassModel().PopModel();
                    n.Company = "fsdfsdf";
          
                    return View(n);
              }
          

          @Html.TextBoxFor(u =&gt; u.Company, new { @placeholder = Model.Company })

          【讨论】:

          • 我真的想避免使用 TextBoxFor 并坚持使用 EditorFor 以保持数据注释和验证到位。
          【解决方案9】:

          查看这个问题的答案,该问题已经回答了(几次)。

          @Html.EditorFor 使用模板,因此解决此问题的方法是使用自定义模板。

          【讨论】:

          • 链接的问题没有解决从属性标签填充“占位符”的具体问题。然而,在这里使用自定义模板是一种有效的方法——不过如果有示例代码就好了。
          【解决方案10】:

          您可以按如下方式使用它作为日期,这也会给您一个“日期时间”选择器。

          [DisplayFormat(DataFormatString ="{0:yyyy-MM-dd}",ApplyFormatInEditMode =true)]
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-11-27
            • 1970-01-01
            • 1970-01-01
            • 2013-01-18
            • 1970-01-01
            • 2014-11-24
            • 2012-01-03
            • 1970-01-01
            相关资源
            最近更新 更多