Модели ModelMetadata.Watermark и MVC View

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

Здесь уже есть несколько постов, в том числе довольно сфокусированный:

Заполнители HTML5 с расширением .NET MVC 3 Razor EditorFor?

В этих сообщениях даются советы по созданию измененных шаблонов 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-тег-заполнитель правильно отображается на моей отображаемой веб-странице, но он пуст, хотя тег Name заполнен правильно, даже без украшения DisplayName, установленного в свойстве моей модели представления.

http://localhost/testpage

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

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

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

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

Николас.

Редактировать:

А что, если я создам больше переменных в своей модели.

Например:

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

а потом

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

?


person user1288337    schedule 23.03.2012    source источник


Ответы (2)


Причина, по которой вы получаете пустой водяной знак, заключается в том, что в вашем случае (т. е. без использования шаблонов) 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(). Он не шаблонный.

person Daniel Liuzzi    schedule 24.03.2012
comment
Без проблем. Я не уверен, что вы пытаетесь сделать в своем последнем примере. Placeholder это просто строка. Передача лямбды, как вы делаете, не сработает. И даже если бы это было так, зачем вам использовать значение свойства в качестве водяного знака? Вот для чего нужен атрибут value. Если все, что вы хотите сделать, это иметь гибкость с водяным знаком, шаблонный подход является наиболее элегантным и простым, IMO. Есть ли какая-то конкретная причина, по которой вы не хотите идти по этому пути? - person Daniel Liuzzi; 26.03.2012
comment
не могу поверить, что это все еще происходит на MVC4... EditorFor не хватает htmlAttributes, а TextBoxFor не хватает заполнителей.... - person Bart Calixto; 20.08.2013

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

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

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

person Kristine    schedule 25.05.2014
comment
Он доступен с MVC 2 (bradwilson.typepad.com/blog/2009/10/ и stackoverflow.com/questions/6443565/) - person Kristine; 25.05.2014