我很难在MVC3表单输入上显示水印(即所谓的占位符)。
这里已经有很少的帖子在讨论了,包括这里相当专注的一个:
Html5 Placeholders with .NET MVC 3 Razor EditorFor extension?
在这些帖子中,建议创建经过调整的html.TextBox模板。在我的例子中,我的优点是我不应该需要任何编辑器模板,因为我正在内联调整它们。
这比冗长的谈话更好,下面是实际代码的相关部分:
~/Models/myModel.cs
namespace myProject.Models {
public class myFormModel {
...
[Display(Name = "firstFieldName", Prompt = "firstFieldPrompt")]
public string firstFieldValue { get; set; }
...
}
}~/Controllers/myFormSurfaceController.cs
namespace myProject.Controllers {
public class myFormSurfaceController : SurfaceController {
...
[ChildActionOnly]
public PartialViewResult myForm()
{
return PartialView("myPartialView", new myFormModel());
}
...
[HttpPost, ValidateAntiForgeryToken]
public ActionResult handleMyFormSubmit(myFormModel model) {...}
...
}
}~/Views/myProject/Partial/myPartialView.cshtml
@model myFormModel
@{
using (Html.BeginUmbracoForm("handleMyFormSubmit", "myFormSurface", null, new Dictionary<string, object> { { "class", "myFormStyle" }, { "id", "myFormId" } }))
{
...
@Html.TextBoxFor(x => x.firstFieldValue, new { @class = "myInputStyle", @placeholder = ViewData.ModelMetadata.Watermark })
...
}
}结果是占位符html标记正确地显示在我渲染的网页上,但是即使没有在我的视图模型的属性上设置DisplayName装饰,名称标记也是空的。
http://localhost/testpage
...
<input type="text" value="" placeholder="" name="firstFieldName" id="firstFieldName" class="myInputStyle">
...这里我漏掉了什么?我确实尝试过在正确的文件夹(~/Views/Shared/EditorTemplates/)中创建两个编辑器模板(MultilineText和String),但我假设它们从未被调用过,因为我使用的是"Html.TextBoxFor“而不是”Html.TextBox“……
另外,如果我从@Html.TextBoxFor调用中删除"@placeholder = ViewData.ModelMetadata.Watermark“,我不会在呈现的网页上显示任何"placeholder”。这很好,呼叫的这一部分肯定是好的。
提前感谢你在这一点上的帮助……
尼古拉斯。
编辑:
如果我在我的模型中创建更多的变量呢?
例如:
public string firstFieldPrompt { get { return "bla"; } set { } } 然后
@Html.TextBoxFor(x => x.firstFieldValue, new { @class = "myInputStyle", @placeholder = x => x.FirstFieldPrompt })发布于 2012-03-25 05:16:17
您得到空水印的原因是,在您的情况下(即不使用模板),ViewData实际上引用了myFormModel (而不是myFormModel.firstFieldValue);您实际上是在检索视图模型的水印。由于模型不能有水印([Display]不能应用于类),因此对于视图,ViewData.ModelMetadata.Watermark将始终为空。
据我所知,你在这里唯一的选择(如果你不想使用模板)就是内联水印:
@Html.TextBoxFor(x => x.firstFieldValue, new { @class = "myInputStyle", placeholder = "Your watermark text here" })顺便说一句,如果想使用模板,你需要使用模板化的助手@Html.EditorFor()和@Html.DisplayFor()。@Html.TextBoxFor()只是@Html.TextBox()的强类型版本。它没有模板化。
发布于 2014-05-25 13:59:11
我知道这是个老方法,但是你可以在你的视图中使用ModelMetadata.FromLambdaExpression()方法(不使用模板)。
@Html.TextBoxFor(x => x.firstFieldValue,
new {
@class = "myInputStyle",
@placeholder = ModelMetadata.FromLambdaExpression(x => x.firstFieldValue, ViewData).Watermark
})希望这对某些人有帮助:-)
https://stackoverflow.com/questions/9841233
复制相似问题