2012-03-23 7 views
4

Я изо всех сил пытаюсь отобразить водяной знак (так называемый placeholder) на входах формы MVC3.ModelMetadata.Watermark и MVC Просмотр моделей

Существует уже несколько сообщений здесь говорят включая довольно сосредоточены один здесь:

Html5 Placeholders with .NET MVC 3 Razor EditorFor extension?

На этих постах, совет сделал для создания подправили шаблоны Html.TextBox. В моем случае, мой актив заключается в том, что мне не нужен какой-либо редакторский шаблон, поскольку я настраиваю их inline.

лучше, чем длинные переговоры, вот соответствующая часть фактического кода:

~/Модели/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 }) 
    ... 
    } 
} 

Результат заключается в том, что тег httml-заполнителя правильно отображается на моей отображаемой веб-странице, но пуст, хотя тег Name заполнен правильно, даже без украшения DisplayName, установленного в моем представлении модели.

http://localhost/testpage

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

Что я здесь отсутствует? Я действительно попытался создать оба шаблона редактора (MultilineText и String) в правильной папке (~/Views/Shared/EditorTemplates /), но я предполагаю, что они никогда не вызываются, поскольку я использую «Html.TextBoxFor», а не «Html». TextBox "...

Другое дело, если я удалю« @placeholder = ViewData.ModelMetadata.Watermark »из вызова @ Html.TextBoxFor, у меня нет никакого« заполнителя », отображаемого на отображаемой веб-странице. Что хорошо, эта часть вызова окончательно прекрасна.

Заранее спасибо за любую помощь по этому вопросу ...

Николя.

Edit:

Что если я создаю больше переменной в моей модели.

Например:

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

Нет проблем. Я не уверен, что вы пытаетесь сделать в своем последнем примере. «Заполнитель» - это просто строка. Передача лямбда, как вы делаете, не будет работать. И даже если бы это было так, зачем вы хотите использовать значение свойства как водяной знак? Для этого используется атрибут value. Если все, что вы хотите сделать, это гибкость с водяным знаком, подход к шаблону является самым изящным и простым IMO. Есть ли какая-то особая причина, по которой вы не хотите идти по этому маршруту? –

+1

не может поверить, что это все еще происходит на MVC4 ... EditorFor недостает htmlAttributes и TextBoxFor недостает заполнителей .... –

9

Я понимаю, что это старичок, но вы можете использовать ModelMetadata.FromLambdaExpression() метода из вашей точки зрения (без использования шаблонов), т.е.

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

Надеется, что это поможет кому-тому :-)

+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/жерех-нетто-2 MVC-пробивной-modelmetadata-с-а-зрения-без-а-заказ шаблон) – Kristine