使用.NET MVC 3 Razor Editor进行扩展的Html5占位符?

see*_*kay 91 asp.net-mvc html5 editorfor

有没有办法使用@ Html.EditorFor 编写Html5占位符,或者我应该只使用TextBoxFor扩展名,即

@Html.TextBoxFor(model => model.Title, new { @placeholder = "Enter title here"})
Run Code Online (Sandbox Code Playgroud)

或者编写我们自己的自定义扩展是否有意义,可以通过DataAnnotations使用"描述"显示属性(类似于)?

当然,同样的问题也适用于'自动对焦'.

Dan*_*zzi 120

正如Darin Dimitrov的答案中的smnbss评论一样,Prompt存在于此目的,因此无需创建自定义属性.从文档:

获取或设置一个值,该值将用于为UI中的提示设置水印.

要使用它,只需装饰您的视图模型的属性,如下所示:

[Display(Prompt = "numbers only")]
public int Age { get; set; }
Run Code Online (Sandbox Code Playgroud)

然后方便地放入该文本ModelMetadata.Watermark.开箱即用,MVC 3中的默认模板忽略了Watermark属性,但使其工作非常简单.您需要做的就是调整默认的字符串模板,告诉MVC如何渲染它.只需编辑String.cshtml,就像Darin一样,除了获取水印而不是ModelMetadata.AdditionalValues直接来自ModelMetadata.Watermark:

〜/查看/共享/ EditorTemplates/String.cshtml:

@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue, new { @class = "text-box single-line", placeholder = ViewData.ModelMetadata.Watermark })
Run Code Online (Sandbox Code Playgroud)

就是这样.

正如您所看到的,让一切正常运转的关键在于placeholder = ViewData.ModelMetadata.Watermark.

如果您还想为多行文本框(textareas)启用水印,则对MultilineText.cshtml执行相同的操作:

〜/查看/共享/ EditorTemplates/MultilineText.cshtml:

@Html.TextArea("", ViewData.TemplateInfo.FormattedModelValue.ToString(), 0, 0, new { @class = "text-box multi-line", placeholder = ViewData.ModelMetadata.Watermark })
Run Code Online (Sandbox Code Playgroud)

  • @Brett确实有.EditorFor()是MVC 2中引入的**模板化**助手.乍一看,它似乎与TextBox()完全相同,但它为您提供了一个很大的优势,可以让您精确控制HTML的方式产生.我的回答是基于这个功能来"教"MVC如何处理`Prompt`属性.有关这些模板的更多信息,请参阅Brad Wilson的这篇精彩文章:http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-1-introduction.html (6认同)
  • 默认情况下,@ FracisRodgers`PreitorTemplates`文件夹不存在; 你只需要在`Views\Shared`文件夹中创建(或者如果你希望它特定于某个控制器的`Views\{ControllerName}`).然后,您将.cshtml模板放在此文件夹中,您应该很高兴. (3认同)
  • @DotNetWise我不确定你为什么这么说; `DisplayAttribute`(包括Prompt)的所有字符串参数都是可本地化的.您只需在注释中指定ResourceType:`[Display(ResourceType = typeof(PeopleResources),Prompt ="AgePrompt")]`.就是这样.水印文本现在来自资源_PeopleResources_中的键_AgeGroup_. (2认同)
  • @RobertIvanc我已经编辑了答案并且还原了Raleigh Buckner所做的编辑,导致了你和Ted报告的问题.谢谢. (2认同)

Dar*_*rov 68

您可以查看以下文章来编写自定义DataAnnotationsModelMetadataProvider.

这是另一个涉及新引入的IMetadataAware接口的ASP.NET MVC 3ish方法.

首先创建一个实现此接口的自定义属性:

public class PlaceHolderAttribute : Attribute, IMetadataAware
{
    private readonly string _placeholder;
    public PlaceHolderAttribute(string placeholder)
    {
        _placeholder = placeholder;
    }

    public void OnMetadataCreated(ModelMetadata metadata)
    {
        metadata.AdditionalValues["placeholder"] = _placeholder;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后用它装饰你的模型:

public class MyViewModel
{
    [PlaceHolder("Enter title here")]
    public string Title { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

接下来定义控制器:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View(new MyViewModel());
    }
}
Run Code Online (Sandbox Code Playgroud)

相应的观点:

@model MyViewModel
@using (Html.BeginForm())
{
    @Html.EditorFor(x => x.Title)
    <input type="submit" value="OK" />
}
Run Code Online (Sandbox Code Playgroud)

最后编辑模板(~/Views/Shared/EditorTemplates/string.cshtml):

@{
    var placeholder = string.Empty;
    if (ViewData.ModelMetadata.AdditionalValues.ContainsKey("placeholder"))
    {
        placeholder = ViewData.ModelMetadata.AdditionalValues["placeholder"] as string;
    }
}
<span>
    @Html.Label(ViewData.ModelMetadata.PropertyName)
    @Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue, new { placeholder = placeholder })
</span>
Run Code Online (Sandbox Code Playgroud)

  • 做一个占位符很多工作?必须更简单:S (6认同)
  • 这对MVC3仍然有效吗?我注意到MVC3中有一个新的[Display(Prompt ="type watermark here")]但是无法使它工作.任何的想法? (4认同)
  • @smnbss你是对的.请参阅我的回答,了解如何使"提示"工作. (2认同)

The*_*ica 22

我实际上更喜欢在大多数时间使用占位符文本的显示名称.以下是使用DisplayName的示例:

  @Html.TextBoxFor(x => x.FirstName, true, null, new { @class = "form-control", placeholder = Html.DisplayNameFor(x => x.FirstName) })
Run Code Online (Sandbox Code Playgroud)