2012-03-23 90 views
4

我努力在MVC3表單輸入中顯示水印(所謂的佔位符)。ModelMetadata.Watermark和MVC查看模型

已經有幾個崗位這兒說話包括相當集中一個位置:

Html5 Placeholders with .NET MVC 3 Razor EditorFor extension?

在這些帖子,建議由創建扭捏html.TextBox模板。 就我而言,我的資產是我不應該需要任何編輯器模板,因爲我正在對它們進行內聯調整。

比長談更好

,這裏是實際的代碼的相關部分:

〜/型號/ myModel.cs

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

〜/控制器/ 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裝飾,Name標記正確填充也是空的。

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「,我沒有任何」佔位符「顯示在渲染的網頁上。這很好,這部分電話確實很好。

在此先感謝您的任何幫助...

尼古拉斯。

編輯:

怎麼樣,如果我在我的模型創造更多的變數。

例如:

public string firstFieldPrompt { get { return "bla"; } set { } } 

然後

@Html.TextBoxFor(x => x.firstFieldValue, new { @class = "myInputStyle", @placeholder = x => x.FirstFieldPrompt }) 

+0

艱難的一個不是嗎? :) – user1288337 2012-03-23 18:44:21

回答

7

你得到一個空的水印的原因是,在你的情況(即不使用模板)的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()的強類型版本。它不是模板化的。

+0

好的,很酷。謝謝你的幫助。請參閱我上面的編輯。 – user1288337 2012-03-25 10:00:25

+0

沒問題。我不確定你在最後一個例子中想要做什麼。 '佔位符'只是一個字符串。傳遞像你這樣的lambda是不行的。即使是這樣,爲什麼你要使用該屬性的值作爲水印?這就是價值屬性的意義所在。如果你想要做的只是靈活處理水印,模板方法是最優雅和直接的IMO。有沒有什麼特別的原因你不想走這條路? – 2012-03-26 14:01:24

+1

不能相信這仍然發生在MVC4上... EditorFor缺少htmlAttributes和TextBoxFor缺少佔位符.... – 2013-08-20 00:20:00

9

我意識到這是一個過時的歌曲,但你可以使用ModelMetadata.FromLambdaExpression()方法從您的視圖中(不使用模板),即

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

希望這可以幫助別人:-)

+0

它也適用於MVC 3嗎? – Stefan 2014-05-25 06:21:54

+1

自從MVC 2發佈以來(http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-2-modelmetadata.html和http://stackoverflow.com/questions/6443565/ASP淨MVC -2-得到-modelmetadata從 - 一 - 視圖 - 無-A-定製模板) – Kristine 2014-05-25 11:42:35