首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ModelMetadata.Watermark和MVC视图模型

ModelMetadata.Watermark和MVC视图模型
EN

Stack Overflow用户
提问于 2012-03-23 22:44:21
回答 2查看 6.1K关注 0票数 5

我很难在MVC3表单输入上显示水印(即所谓的占位符)。

这里已经有很少的帖子在讨论了,包括这里相当专注的一个:

Html5 Placeholders with .NET MVC 3 Razor EditorFor extension?

在这些帖子中,建议创建经过调整的html.TextBox模板。在我的例子中,我的优点是我不应该需要任何编辑器模板,因为我正在内联调整它们。

这比冗长的谈话更好,下面是实际代码的相关部分:

~/Models/myModel.cs

代码语言:javascript
复制
namespace myProject.Models {
  public class myFormModel {
    ...
    [Display(Name = "firstFieldName", Prompt = "firstFieldPrompt")]
    public string firstFieldValue { get; set; }
    ...
  }
}

~/Controllers/myFormSurfaceController.cs

代码语言:javascript
复制
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

代码语言:javascript
复制
@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

代码语言:javascript
复制
...
<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”。这很好,呼叫的这一部分肯定是好的。

提前感谢你在这一点上的帮助……

尼古拉斯。

编辑:

如果我在我的模型中创建更多的变量呢?

例如:

代码语言:javascript
复制
public string firstFieldPrompt { get { return "bla"; } set { } } 

然后

代码语言:javascript
复制
@Html.TextBoxFor(x => x.firstFieldValue, new { @class = "myInputStyle", @placeholder = x => x.FirstFieldPrompt })
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-25 05:16:17

您得到空水印的原因是,在您的情况下(即不使用模板),ViewData实际上引用了myFormModel (而不是myFormModel.firstFieldValue);您实际上是在检索视图模型的水印。由于模型不能有水印([Display]不能应用于类),因此对于视图,ViewData.ModelMetadata.Watermark将始终为空。

据我所知,你在这里唯一的选择(如果你不想使用模板)就是内联水印:

代码语言:javascript
复制
@Html.TextBoxFor(x => x.firstFieldValue, new { @class = "myInputStyle", placeholder = "Your watermark text here" })

顺便说一句,如果想使用模板,你需要使用模板化的助手@Html.EditorFor()@Html.DisplayFor()@Html.TextBoxFor()只是@Html.TextBox()的强类型版本。它没有模板化。

票数 7
EN

Stack Overflow用户

发布于 2014-05-25 13:59:11

我知道这是个老方法,但是你可以在你的视图中使用ModelMetadata.FromLambdaExpression()方法(不使用模板)。

代码语言:javascript
复制
    @Html.TextBoxFor(x => x.firstFieldValue, 
        new { 
            @class = "myInputStyle", 
            @placeholder = ModelMetadata.FromLambdaExpression(x => x.firstFieldValue, ViewData).Watermark 
    })

希望这对某些人有帮助:-)

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9841233

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档