2013-04-16 94 views
41

默認支持MVC4是否支持placeholders生成的輸入字段?我沒有找到任何東西,所以我試圖實現我自己的,但不幸的是Prompt = "E-Mail"沒有傳遞給ViewData.ModelMetadata.Watermark,同時生成控制。爲什麼?MVC4輸入字段佔位符

型號

public class LogOnModel 
{ 
    [Required] 
    [Display(Name = "E-Mail", Prompt = "E-Mail")] 
    [DataType(DataType.EmailAddress)] 
    public string Email { get; set; } 
} 

@Html.TextBoxFor(m => m.Email, new { placeholder = ViewData.ModelMetadata.Watermark }) 

我拿到哪裏placeholder標籤不具有任何文本

<input data-val="true" data-val-regex="Please enter a valid e-mail address" data-val-required="The E-Mail field is required." id="Email" name="Email" placeholder="" type="text" value="" class="valid"> 
+1

這個問題是一樣的:http://stackoverflow.com/questions/9841233/modelmetadata-watermark-and-mvc-view-models。建議的答案是使用'EditorFor'而不是'TextBoxFor'或使用內聯佔位符... –

+0

嗯,對不起,我的意思是*模板* EditorFor(這意味着你把它放在特殊的目錄「EditorTemplates」中並指向它模型到你的領域......)。 –

回答

43

使用插件的方法是使用一個編輯模板。您需要做的是在Shared\EditorTemplates文件夾中創建模板文件,並將其命名爲String.cshtml。然後把這個在文件:

@Html.TextBox("",ViewData.TemplateInfo.FormattedModelValue, 
    new { placeholder = ViewData.ModelMetadata.Watermark }) 

然後在你看來像這樣使用它:

@Html.EditorFor(m=>Model.UnitPercent) 

的缺點,這個工程的string類型的屬性,你必須創建一個模板每個type你想支持一個水印。

+1

我做到了,但@ Html.EditorFor(m => m.Email )永遠不會調用並使用Shared \ EditorTemplates \ String.cshtml。任何想法爲什麼? – Tomas

+0

我發現這個問題,在我的情況下,該文件應該是EmailAddress.schtml,因爲我的模型屬性類型是[DataType(DataType.EmailAddress)] – Tomas

+1

你明白了!只要記住那是它的缺點。 –

4

默認的HTML代碼,它沒有。但是,您可以使用具有可以輸出HTML5的HTML助手的MVCHtml5Toolkit NuGet包。對於你的榜樣,安裝工具包後,你就可以使用下面的HTML助手呼籲:

@Html.Html5TextBoxFor(m => m.Email, InputTypes.InputType.Email) 

這將輸出以下HTML:

<input id="Email" name="Email" placeholder="E-Mail" type="Email" value=""> 

可以看出,佔位符現在可以正確渲染。

25

當然它的作用:

@Html.TextBoxFor(x => x.Email, new { @placeholder = "Email" }) 
+2

我想用MVC的方法。 – Tomas

+0

我明白了,我誤解了你的問題。也許像von.v這樣的編輯模板會是一個解決方案。另請參閱此線程:http://stackoverflow.com/questions/5824124/html5-placeholders-with-net-mvc-3-razor-editorfor-extension – Panos

-3

試試這個:

@Html.TextbBoxFor(x=>x.Email,new { @[email protected]} 

如果可能,否則可能是什麼方式

+0

這不是質量答案。請改善您的回答 – Abi

6

這工作:

@Html.TextBox("name", null, new { placeholder = "Text" }) 
+0

耶斯男人它的工作。謝謝 –

+0

只告訴我一件事,爲什麼我們在它之前使用null。 –

+0

這一個工作。謝謝 –

11

您可以輕鬆地添加CSS類,佔位符等。如下圖所示:

@Html.TextBoxFor(m => m.Name, new { @class = "form-control", placeholder="Name" }) 

希望這有助於

+0

最直接的解決方案國際海事組織。謝謝。 – Kanapolis

35

我這樣做

場模型:

[Required] 
[Display(Name = "User name")] 
public string UserName { get; set; } 

剃刀:

<li> 
    @Html.TextBoxFor(m => m.UserName, new { placeholder = Html.DisplayNameFor(n => n.UserName)}) 
</li> 
+0

這很好,很簡單。不需要任何額外的模板,併爲ViewModel屬性提取Display屬性很好又簡單。 – Ant

+0

這將雙重轉義在DisplayName中提供的文本 - 給定示例沒有問題,但如果添加法語口音,例如,這將是一個問題。 – marapet

6

有這樣的方式綁定佔位符以查看:

1)隨着使用MVC數據註釋的:

型號:

[Required] 
[Display(Prompt = "Enter Your First Name")] 
public string FirstName { get; set; } 

剃刀語法:

@Html.TextBoxFor(m => m.FirstName, new { placeholder = @Html.DisplayNameFor(n => n.UserName)}) 

2)同使用MVC數據註釋的但隨着DisplayName的:

型號:

[Required] 
[DisplayName("Enter Your First Name")] 
public string FirstName { get; set; } 

剃刀語法:

@Html.TextBoxFor(m => m.FirstName, new { placeholder = @Html.DisplayNameFor(n => n.UserName)}) 

3)在不使用MVC數據註解的(推薦):

剃刀語法:

@Html.TextBoxFor(m => m.FirstName, new { @placeholder = "Enter Your First Name") 
+0

'placeholder = @ Html.DisplayNameFor ...'將雙重轉義displayName文本,例如在法國口音的情況下會出現問題。 – marapet

-1
@Html.TextBoxFor(m => m.UserName, new { @class = "form-control",@placeholder = "Name" }) 
+1

這是一個質量很低的帖子。請改進。現在它是一個代碼轉儲。 – Drew

2

正確的解決方案,使在非模板控制方面的Prompt值:

@Html.TextBoxFor(model => model.Email, 
    new { placeholder = ModelMetadata.FromLambdaExpression(m => m.Email, ViewData).Watermark } 
) 

這也將雙逃脫水印文本。

+0

這是我正在尋找的正確答案。謝謝!它也適用於kendo彈出式自定義模板。 – Philippe

+0

不客氣。我最近不得不爲自己深挖... – marapet