@android~paranoid
Citat:
public ActionResult ListaStranica(int page, Collection<Product> Lista)
Pitanje je kako da prosledim ovoj metodi Listu iz View-a?
@mmix
Citat:
JA nisam siguran da je to moguce, mislim da precenjujes sposobnosti MVCa :)
Ti si bas hejter sto se tice Ms tehnologija, pa ih mozda zato i potcenjujes - cekaj, nemoj unapred :)
Evo (samo jednog od nacina) kako moze da se dobije tipizirana lista u metodi kontrolera slanjem parametara iz view-a:
Jedna stavka koja je cesto overlooked u asp net mvc je ModelBinder - mehanizam koji omogucava mapiranje
raw http requesta u parametre action metoda controllera. Svaki put kada do kontrolera stigne http request u key/value formi, poziva se
DefaultModelBinder koji omogucava da se raw http request pretvori u nesto "opipljivije", typed net objekat recimo (sto ce u nasem slucaju biti lista) objekata).
E ako zelimo da customizujemo nacin na koji ce se http request mapirati u parametre metoda, potrebno je, koliko znam da se uradi sledece:
Primer modela:
Code:
public class NewsPaper
{
public string Make { get; set; }
public int Id { get; set; }
public static List<NewsPaper> GetNewsPapers()
{
return new List<NewsPaper>
{
new NewsPaper { Id = 1, Make = "Blic"},
new NewsPaper { Id = 2, Make = "Novosti"},
new NewsPaper { Id = 3, Make = "Politika"}
};
}
}
Zatim metod kontrolera:
Code:
[HttpPost]
public ActionResult PostNewsPapers(List<NewsPaper> newspapers)
{
return .....
}
E sada ako imas multi select html kontrolu post na ovu metodu ne bi radio (naravno).
Zato pravimo klasu koja ce implementirati
IModelBinder interface
Code:
public class SelectListModelBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var incomingData = bindingContext.ValueProvider.GetValue("newspapers").AttemptedValue;
return incomingData.Split(new char[1] { ',' }).Select
(data => NewsPaper.GetNewsPapers().
FirstOrDefault(o => o.Id == int.Parse(data))).ToList();
}
}
Imamo referencu bindingContext i u njoj Request.Form vrednosti multiple select liste. Odatle vracamo NewsPaper objekat popunjen poslatim vrednostima.
U Application_Start() registrujemo:
Code:
ModelBinders.Binders.Add(typeof (List<NewsPaper>), new SelectListModelBinder());
Da bi smo koristili custom model binder potrebno je postaviti prefix u metodu kotrolera, ispred tipizirane liste
Code:
public ActionResult PostNewsPapers([ModelBinder(typeof(SelectListModelBinder))] List<NewsPaper> newspapers)
{
.....
}
Ovo je proof of concept za neke use casove, prilicno interesantno i ne bas jako tesko :)
Postoje i drugi nacini da se ovo uradi, ali drugi put :)
[Ovu poruku je menjao branimir.ts dana 03.10.2010. u 14:09 GMT+1]