Você pode dar uma olhada no seguinte artigo para escrever umDataAnnotationsModelMetadataProvider
.
E aqui está outra maneira mais ASP.NET MVC 3 de proceder envolvendo a interface IMetadataAware recém-introduzida .
Comece criando um atributo personalizado implementando esta interface:
public class PlaceHolderAttribute : Attribute, IMetadataAware
{
private readonly string _placeholder;
public PlaceHolderAttribute(string placeholder)
{
_placeholder = placeholder;
}
public void OnMetadataCreated(ModelMetadata metadata)
{
metadata.AdditionalValues["placeholder"] = _placeholder;
}
}
E então decore seu modelo com ele:
public class MyViewModel
{
[PlaceHolder("Enter title here")]
public string Title { get; set; }
}
Em seguida, defina um controlador:
public class HomeController : Controller
{
public ActionResult Index()
{
return View(new MyViewModel());
}
}
Uma visão correspondente:
@model MyViewModel
@using (Html.BeginForm())
{
@Html.EditorFor(x => x.Title)
<input type="submit" value="OK" />
}
E, finalmente, o modelo de editor ( ~/Views/Shared/EditorTemplates/string.cshtml
):
@{
var placeholder = string.Empty;
if (ViewData.ModelMetadata.AdditionalValues.ContainsKey("placeholder"))
{
placeholder = ViewData.ModelMetadata.AdditionalValues["placeholder"] as string;
}
}
<span>
@Html.Label(ViewData.ModelMetadata.PropertyName)
@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue, new { placeholder = placeholder })
</span>
Prompt
funcionar.Como comentários smnbss na resposta de Darin Dimitrov,
Prompt
existe exatamente para esse propósito, portanto, não há necessidade de criar um atributo personalizado . Da documentação:Para usá-lo, basta decorar a propriedade do seu modelo de visualização assim:
Este texto é então convenientemente colocado em
ModelMetadata.Watermark
. Pronto para usar, o modelo padrão em MVC 3 ignora aWatermark
propriedade, mas fazê-la funcionar é realmente simples. Tudo que você precisa fazer é ajustar o modelo de string padrão para dizer ao MVC como renderizá-lo. Basta editar String.cshtml, como Darin faz, exceto que, em vez de obter a marca d'água deModelMetadata.AdditionalValues
, você a obtém diretamente deModelMetadata.Watermark
:~ / Views / Shared / EditorTemplates / String.cshtml:
E é isso.
Como você pode ver, a chave para fazer tudo funcionar é o
placeholder = ViewData.ModelMetadata.Watermark
bit.Se você também deseja habilitar a marca d'água para caixas de texto com várias linhas (áreas de texto), faça o mesmo para MultilineText.cshtml:
~ / Views / Shared / EditorTemplates / MultilineText.cshtml:
fonte
Prompt
atributo. Para obter mais informações sobre esses modelos, você pode consultar esta excelente postagem de Brad Wilson: bradwilson.typepad.com/blog/2009/10/…DisplayAttribute
(incluindo Prompt) são localizáveis. Você só precisa especificar o ResourceType em sua anotação:[Display(ResourceType = typeof(PeopleResources), Prompt = "AgePrompt")]
. E é isso. O texto da marca d'água agora vem do AgeGroup chave no recurso PeopleResources .EditorTemplates
pasta @FrancisRodgers não está lá por padrão; você acabou de criar na suaViews\Shared
pasta (ouViews\{ControllerName}
se quiser que seja específico para um determinado controlador). Em seguida, coloque seus modelos .cshtml dentro desta pasta e estará pronto para prosseguir.Na verdade, prefiro usar o nome de exibição para o texto do espaço reservado na maioria das vezes. Aqui está um exemplo de uso do DisplayName:
fonte
Eu escrevi uma aula tão simples:
O uso como tal:
E propriedade em um modelo de vista:
Observe o parâmetro Prompt. Neste caso, eu uso strings de recursos para localização, mas você pode usar apenas strings, apenas evite o parâmetro ResourceType.
fonte
Eu uso assim com arquivo de recursos (não preciso mais do Prompt!)
fonte
Aqui está uma solução que fiz usando as idéias acima que podem ser usadas para TextBoxFor e PasswordFor:
fonte
Acho que criar um EditorTemplate personalizado não é uma boa solução, porque você precisa se preocupar com muitos tepmlates possíveis para diferentes casos: strings, numsers, comboboxes e assim por diante. Outra solução é a extensão personalizada para HtmlHelper.
Modelo:
Extensão auxiliar Html:
}
Uma visão correspondente:
fonte