3 Comments

U izradi sučelja jedne ASP.NET MVC aplikacije morao sam dobiti listu radio buttona, sa jednim defaultnim odabirom. Jednostavno, pomislih, postoji HtmlHelper za to. Pogledah po spisku u Intellisense autocomplete dialogu, i stvarno je tamo, Html.RadioButtonList(). Tu je moj sreća završila, jer taj helper ništa ne radi, odnosno ja nisam uspio dokučiti što da radim sa njime! Dobijem array stringova, sa zapisima input type="radio" /> , koje bi ja trebao sa foraech petljom ispisivati, plus dodavati labele jer njih helper nije napravio. Iz vjerskih uvjerenja nisam htio odrađivati posao helpera, pa mi nije ostali ništa drugo nego da napravim svoj. I konačno malo prilike da se poigram sa Reflectionom, tim mracnim djelom frameworka kojim me baka plašila kada sam bio mali ;)
Cilj je dobiti ovakav kod:




Html Helper kao extension metoda na HtmlHelper klasu:

namespace Microsoft.Web.Mvc
{
	public static class HelperExtMethods
	{
		public static string MyRadioButtonList(this HtmlHelper helper,string name, SelectList list)
		{
			PropertyInfo DataInfo = null;
			PropertyInfo ValueInfo = null;
			StringBuilder builder=new StringBuilder();
			string pattern = "";
			foreach (var item in list.Items)
			{
                if (DataInfo == null)
				{
                    DataInfo = item.GetType().GetProperty(list.DataTextField);
					ValueInfo = item.GetType().GetProperty(list.DataValueField);
				}
                string data = DataInfo.GetValue(item, null).ToString();
				string value = ValueInfo.GetValue(item, null).ToString();
				if(list.SelectedValue==value)
					builder.AppendFormat(pattern, name, value, "radio" + value, data,"checked");
				else
					builder.AppendFormat(pattern, name, value, "radio" + value, data,"");
			}
			return builder.ToString();
		}
	}
}

Glupo ime helper, ali poslužiti će dokle ne smislim nešto bolje (RadioButtonListTurboDiesel npr?).
Upotreba helpera:

<%= Html.MyRadioButtonList("GodisnjeDoba",new SelectList(Model.ListaDoba,"Id","Naziv",Model.SelectedDoba)) %>
Doba (u Model.Doba) je klasa koja ima dva propertya, Id i Naziv. Pomoću refleksija u foreach petlji čitamo njihov sadržaj i kreiramo potrebni Html. Iako su refleksije najsporiji način dohvata vrijednosti u objektima, mislim da za ovih nekoliko objekata koje čitamo preko refleksija ne utječemo previše na vrijeme učitavanja stranice. Ako znate bolji (brži) način čitanja propertya, ostavite komentar pa ću prepraviti ovaj kod i dati drugu verziju!

Oprez: ovaj kod ne sadrži nikakve provjere valjanosti ulaznih parametra; što znači da ako mu ne pošaljete na primjer defaultnu vrijednost za selektirani radio button, dobiti će te za nagradu asp.net-ov yellow screen of death. Upozoreni ste!

Comments

Comment by new york

Valuable information. Lucky me I found your site by accident, and I am shocked why this accident did not happened earlier! I bookmarked it.

Comment by male fitness

As you become older, your gents medical problems will probably transform. Could any dark beer instinct bring about illnesses?