Введите заполнитель из метаданных ViewModel в ASP.NET Core 1.0.

Можно ли настроить встроенный помощник тега asp-for, чтобы взять заполнитель ввода из атрибута [Display(Prompt = "This is the placeholder")] в модели представления.

[Display(Name="Name", Prompt = "This is the placeholder")]        
public string Name { get; set; }

В MVC 5 я могу добиться этого, добавив дополнительную логику в мои шаблоны редактора и проверив свойство ViewData.ModelMetadata.Watermark. Например:

@model string
@{
    Dictionary<string, object> htmlAttributes = new Dictionary<string, object>();
    htmlAttributes.Add("class", "form-control");
    if (!string.IsNullOrWhiteSpace(ViewData.ModelMetadata.Watermark))
    {
        htmlAttributes.Add("placeholder", ViewData.ModelMetadata.Watermark);
    }
}
@Html.Label("")
@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue, htmlAttributes)
@Html.ValidationMessage("", "", new { @class = "text-danger" })

Но теперь, в ASP.NET Core 1.0, я хотел бы начать использовать новый подход к вспомогательным функциям тегов. По умолчанию сборка в помощнике asp-for просто игнорирует значение атрибута Prompt.

Имея свою собственную реализацию атрибута asp-for, например. my-asp-for - это вариант, и, скорее всего, я в конечном итоге возьму его для удобства обслуживания и повторного использования дополнительной логики. Но тогда свойства Watermark больше нет в ModelMetadata, т.е. нет такого понятия, как For.Metadata.Watermark.

Единственное место, где я вижу значение Prompt в помощнике asp-for, несколько скрыто.

введите описание изображения здесь

Итак, у меня есть два вопроса. Есть ли более разумный способ сделать это? Является ли плохой практикой брать заполнитель из метаданных модели представления, т. Е. Я должен явно указать его в файле бритвы?


person regnauld    schedule 17.03.2016    source источник


Ответы (2)


Я только что провел быстрый тест, и, если я вас правильно понял, у меня это работает из коробки с шаблоном VS по умолчанию:

Модель:

public class LoginViewModel
{
    [Required]
    [EmailAddress]
    [Display(Name = "Email", Prompt = "[email protected]")]
    public string Email { get; set; }

    [Required]
    [DataType(DataType.Password)]
    public string Password { get; set; }

    [Display(Name = "Remember me?")]
    public bool RememberMe { get; set; }
}

Посмотреть фрагмент:

<div class="form-group">
    <label asp-for="Email" class="col-md-2 control-label"></label>
    <div class="col-md-10">
        <input asp-for="Email" class="form-control" />
        <span asp-validation-for="Email" class="text-danger"></span>
    </div>
</div>

Результат:

введите здесь описание изображения

person Sock    schedule 17.06.2016
comment
У меня тоже работает. Спасибо! - person Plebsori; 01.08.2016

person    schedule
comment
Обычно лучше объяснить решение, чем просто публиковать несколько строк анонимного кода. Вы можете прочитать Как написать хороший ответ, а также Объяснение полностью основанных на коде ответов. - person Massimiliano Kraus; 16.10.2017
comment
Да, ты прав. Я думаю, что этот код понятен. В дополнительных пояснениях нет необходимости. Особенно эта часть. => Html.DisplayNameFor(m => m.Tags) - person caras; 18.10.2017