2012-03-23 8 views
4

MVC3フォーム入力にウォーターマーク(いわゆるプレースホルダ)を表示するのに苦労しています。ModelMetadata.WatermarkとMVCビューモデル

すでにかなりここ1焦点を当てなどの話をダウンここではいくつかの記事があります:これらの記事で

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タグがレンダリングされたWebページ上に正しく表示されていますが、ビュー・モデルのプロパティーにDisplayNameデコレーションが設定されていなくてもNameタグが正しく埋められていても空です。

http://localhost/testpage

... 
<input type="text" value="" placeholder="" name="firstFieldName" id="firstFieldName" class="myInputStyle"> 
... 

私はここで何をしないのですか?正しいフォルダ(〜/ Views/Shared/EditorTemplates /)に両方のエディタテンプレート(MultilineTextとString)を作成しようとしましたが、Html.TextBoxForではなくHtml.ThreadBoxForを使用しているので、 ... TextBox "...

他のものは、@ Html.TextBoxForの呼び出しから" @ placeholder = ViewData.ModelMetadata.Watermark "を削除した場合、レンダリングされたWebページに「プレースホルダ」は表示されません。どちらが良いですか、コールのこの部分は間違いなく素晴らしいです。その点上の任意の助けを事前に

おかげで...

ニコラス。

編集:

私は私のモデルでより多くの変数を作成した場合について。例えば

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

、その後

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

+0

厳しい方ではないですか? :) – user1288337

答えて

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

+0

問題ありません。最後の例で何をしようとしているのか分かりません。 'Placeholder'は単なる文字列です。あなたがしているようにラムダを渡すことは動作しません。そしてそれがあったとしても、なぜそのプロパティの値を透かしとして使用したいのですか?これがvalue属性の目的です。あなたがしたいのは、ウォーターマークに柔軟性を持たせることだけです。テンプレートアプローチは、最もエレガントでわかりやすいIMOです。あなたがそのルートに行きたくない特別な理由はありますか? –

+1

これはまだMVC4で起こっているとは思えません... EditorForにはhtmlAttributesとTextBoxForがありません。プレースホルダがありません.... –

9

これは

を:-)誰かを助け

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

希望すなわち、私はこれはオールディーズで実現していますが、ビュー内から(テンプレートを使用せずに)ModelMetadata.FromLambdaExpression()メソッドを使用することができます

+0

MVC 3でも同様に動作しますか? – Stefan

+1

これはMVC 2以降で使用されています(http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-2-modelmetadata.htmlおよびhttp://stackoverflow.com/questions)。/6443565/asp-net-mvc-2-getting-model-as-a-a-custom-templateからのメタデータ取得) – Kristine

関連する問題