2016-03-17 6 views
7

Czy można skonfigurować wbudowanego pomocnika znacznika asp-for, aby wstawić element zastępczy z atrybutu [Display(Prompt = "This is the placeholder")] w modelu widoku.Element zastępczy wejściowy z metadanych ViewModel w programie ASP.NET Core 1.0

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

W MVC 5 Jestem w stanie to osiągnąć przez dodanie dodatkowych logiki w moim edytorze szablonów oraz sprawdzenie właściwości ViewData.ModelMetadata.Watermark. Na przykład:

@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" }) 

Ale teraz w ASP.NET Core 1.0 chciałbym rozpocząć korzystanie z nowego podejścia do obsługi tagów. Domyślnie pomocnik asp-for kompilacji ignoruje wartość atrybutu .

Posiadanie własnej niestandardowej implementacji atrybutu asp-for, np. my-asp-for to opcja i najprawdopodobniej skończę ją mieć ze względu na łatwość konserwacji i ponowne wykorzystanie dodatkowej logiki. Ale wtedy właściwość Watermark nie jest już obecna w ModelMetadata, tj. Nie ma czegoś takiego jak For.Metadata.Watermark.

Jedyne miejsce, w którym widzę wartość Prompt w pomocniku asp-for, jest nieco ukryte.

enter image description here

Mam więc dwa pytania. Czy jest to mądrzejszy sposób? Czy niewłaściwym zwyczajem jest przyjmowanie symboli zastępczych z metadanych widoku, tzn. Czy powinienem to wyraźnie określić w pliku brzytwy?

Odpowiedz

15

właśnie zrobić szybki test i jeśli cię rozumiem poprawnie, to wydaje się działać po wyjęciu z pudełka do mnie z domyślnym VS Szablon:

Model:

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; } 
} 

Zobacz fragment:

<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> 

Wynik:

enter image description here

+0

Działa również dla mnie. Dzięki! – Plebsori

+0

Wydaje się nie działać dla '