ModelMetadata.Watermark и MVC View Models - PullRequest
4 голосов
/ 23 марта 2012

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

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

HTML5 Заполнители с .NET MVC 3 Razor Editor для расширения?

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

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

~ / Models / myModel.cs

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

~ / Controllers / 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».TextBox "...

Другое дело, если я удалю" @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 })

?

Ответы [ 2 ]

9 голосов
/ 25 мая 2014

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

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

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

7 голосов
/ 25 марта 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...