Anda dapat melihat artikel berikut untuk menulis kebiasaan DataAnnotationsModelMetadataProvider
.
Dan inilah cara lain, ASP.NET MVC 3ish untuk melanjutkan yang melibatkan antarmuka IMetadataAware yang baru diperkenalkan .
Mulailah dengan membuat atribut khusus yang menerapkan antarmuka ini:
public class PlaceHolderAttribute : Attribute, IMetadataAware
{
private readonly string _placeholder;
public PlaceHolderAttribute(string placeholder)
{
_placeholder = placeholder;
}
public void OnMetadataCreated(ModelMetadata metadata)
{
metadata.AdditionalValues["placeholder"] = _placeholder;
}
}
Dan kemudian hiasi model Anda dengannya:
public class MyViewModel
{
[PlaceHolder("Enter title here")]
public string Title { get; set; }
}
Selanjutnya tentukan pengontrol:
public class HomeController : Controller
{
public ActionResult Index()
{
return View(new MyViewModel());
}
}
Tampilan yang sesuai:
@model MyViewModel
@using (Html.BeginForm())
{
@Html.EditorFor(x => x.Title)
<input type="submit" value="OK" />
}
Dan terakhir template 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
bekerja.Karena komentar smnbs dalam jawaban Darin Dimitrov,
Prompt
tepat untuk tujuan ini, jadi tidak perlu membuat atribut khusus . Dari dokumentasi:Untuk menggunakannya, cukup hiasi properti model tampilan Anda seperti ini:
Teks ini kemudian ditempatkan dengan nyaman
ModelMetadata.Watermark
. Di luar kotak, template default di MVC 3 mengabaikanWatermark
properti, tetapi membuatnya bekerja sangat sederhana. Yang perlu Anda lakukan adalah mengubah template string default, untuk memberi tahu MVC cara merendernya. Cukup edit String.cshtml, seperti yang dilakukan Darin, kecuali bahwa alih-alih mendapatkan tanda airModelMetadata.AdditionalValues
, Anda mendapatkannya langsung dariModelMetadata.Watermark
:~ / Views / Shared / EditorTemplates / String.cshtml:
Dan itu dia.
Seperti yang Anda lihat, kunci untuk membuat semuanya bekerja adalah
placeholder = ViewData.ModelMetadata.Watermark
sedikit.Jika Anda juga ingin mengaktifkan watermarking untuk kotak teks multi-baris (textareas), Anda melakukan hal yang sama untuk MultilineText.cshtml:
~ / Views / Shared / EditorTemplates / MultilineText.cshtml:
sumber
Prompt
atribut tersebut. Untuk informasi lebih lanjut tentang template ini, Anda dapat merujuk ke posting hebat ini oleh Brad Wilson: bradwilson.typepad.com/blog/2009/10/…DisplayAttribute
(termasuk Prompt) dapat dilokalkan. Anda hanya perlu menentukan ResourceType di penjelasan Anda:[Display(ResourceType = typeof(PeopleResources), Prompt = "AgePrompt")]
. Dan itu dia. Teks watermark sekarang berasal dari kunci AgeGroup di sumber daya PeopleResources .EditorTemplates
Folder @FrancisRodgers secara default tidak ada; Anda hanya membuat diViews\Shared
folder Anda (atauViews\{ControllerName}
jika Anda ingin khusus untuk pengontrol tertentu). Anda kemudian menempatkan Anda menempatkan template .cshtml Anda di dalam folder ini dan Anda siap melakukannya.Saya sebenarnya lebih suka menggunakan nama tampilan untuk teks placeholder sebagian besar waktu. Berikut adalah contoh penggunaan DisplayName:
sumber
Saya telah menulis kelas yang sederhana:
Penggunaannya seperti:
Dan properti dalam viewmodel:
Perhatikan parameter Prompt. Dalam hal ini saya menggunakan string dari sumber daya untuk pelokalan tetapi Anda dapat menggunakan hanya string, hindari saja parameter ResourceType.
sumber
Saya menggunakan cara ini dengan file Resource (tidak perlu Prompt lagi!)
sumber
Berikut adalah solusi yang saya buat menggunakan ide-ide di atas yang dapat digunakan untuk TextBoxFor dan PasswordFor:
sumber
Saya pikir membuat EditorTemplate kustom bukanlah solusi yang baik, karena Anda perlu memperhatikan banyak kemungkinan tepmlate untuk berbagai kasus: string, numser, combobox, dan sebagainya. Solusi lainnya adalah ekstensi khusus ke HtmlHelper.
Model:
Ekstensi pembantu HTML:
}
Tampilan yang sesuai:
sumber