ModelMetadata.Watermark和MVC视图模型

use*_*337 5 forms asp.net-mvc watermark placeholder

我正在努力在我的MVC3表单输入上显示水印(所谓的占位符).

这里的帖子已经很少了,包括这里非常专注的帖子:

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

在这些帖子中,建议创建调整的html.TextBox模板.在我的情况下,我的资产是我不需要任何编辑器模板,因为我正在内联调整它们.

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

〜/型号/ myModel.cs

namespace myProject.Models {
  public class myFormModel {
    ...
    [Display(Name = "firstFieldName", Prompt = "firstFieldPrompt")]
    public string firstFieldValue { get; set; }
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

〜/控制器/ 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) {...}
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

〜/查看/ myProject的/部分/ 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 })
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

结果是占位符html标记在我渲染的网页上正确显示,但是尽管名称标记已正确填充,但即使没有在我的视图模型属性上设置DisplayName装饰,它也是空的.

HTTP://本地主机/ testpage

...
<input type="text" value="" placeholder="" name="firstFieldName" id="firstFieldName" class="myInputStyle">
...
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么?我确实尝试在正确的文件夹(〜/ Views/Shared/EditorTemplates /)中创建两个编辑器模板(MultilineText和String),但我认为它们从未被调用,因为我使用的是"Html.TextBoxFor"而不是"Html".文本框"...

另外,如果从@Html.TextBoxFor调用中删除"@placeholder = ViewData.ModelMetadata.Watermark",我在渲染的网页上没有显示任何"占位符".哪个好,这部分电话肯定没问题.

在这一点上提前感谢任何帮助......

尼古拉斯.

编辑:

如果我在模型中创建更多变量怎么办?

例如:

public string firstFieldPrompt { get { return "bla"; } set { } } 
Run Code Online (Sandbox Code Playgroud)

然后

@Html.TextBoxFor(x => x.firstFieldValue, new { @class = "myInputStyle", @placeholder = x => x.FirstFieldPrompt })
Run Code Online (Sandbox Code Playgroud)

小智 9

我意识到这是一个旧手,但您可以在视图中使用ModelMetadata.FromLambdaExpression()方法(不使用模板),即

    @Html.TextBoxFor(x => x.firstFieldValue, 
        new { 
            @class = "myInputStyle", 
            @placeholder = ModelMetadata.FromLambdaExpression(x => x.firstFieldValue, ViewData).Watermark 
    })
Run Code Online (Sandbox Code Playgroud)

希望这有助于某人:-)


Dan*_*zzi 7

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

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

@Html.TextBoxFor(x => x.firstFieldValue, new { @class = "myInputStyle", placeholder = "Your watermark text here" })
Run Code Online (Sandbox Code Playgroud)

顺便说一下,如果想要使用模板,则需要使用模板化帮助器@Html.EditorFor()@Html.DisplayFor().@Html.TextBoxFor()只是强类型的版本@Html.TextBox().它不是模板化的.