c# - Bind a Razor select to a Dictionary from VewData -
i'm writing web-app .net core mvc (dotnet version 1.0.4).
i want pass dictionary<string, string>
in viewdata
object controller view , bind <select>
element.
this result want get:
and tried 2 ways achieve it.
1st way
controller's code
dictionary<string, string> animals = new dictionary<string, string>(); animals.add("1", "cat"); animals.add("2", "dog"); animals.add("3", "bunny"); viewdata["animals"] = new selectlist(animals);
views's code
<select asp-for="animal_id" asp-items="(selectlist)@viewdata["animals"]" class="form-control"></select>
that gives me result
2nd way
controller's code
dictionary<string, string> animals = new dictionary<string, string>(); animals.add("1", "cat"); animals.add("2", "dog"); animals.add("3", "bunny"); viewdata["animals"] = new selectlist(animals.select(r => new selectlistitem { text = r.key, value = r.value }));
views's code
the same.
that gives me result:
apparently, don't understand concept, although feel i'm on right track. can please me - needs done in order result first picture (<option>
s value
s)?
you using overload of selectlist
constructor parameter ienumerable
. overload calls .tostring()
method of each item in collection, , because complex objects, results seeing. overload useful if collection ienumerable<string>
.
you need use overload accepts arguments datavaluefield
, datatextfield
defines properties used options value , display text.
dictionary<string, string> animals = new dictionary<string, string>(); animals.add("1", "cat"); animals.add("2", "dog"); animals.add("3", "bunny"); viewdata["animals"] = new selectlist(animals, "key", "value");
note in 2nd example, have generated ienumerable<selectlistitem>
use new selectlist(...)
create identical ienumerable<selectlistitem>
first 1 pointless ovehead , can be
viewdata["animals"] = animals.select(r => new selectlistitem { text = r.key, value = r.value }));
and in view asp-items="(ienumerable<selectlistitem>)@viewdata["animals"]"
Comments
Post a Comment