Reputation: 4417
I have a model:
public class DocumentModel
{
public int TypeID { get; set; }
public List<SelectListItem> DocumentTypes { get; set; }
}
I have a view:
@Html.DropDownListFor(x => x.TypeID, Model.DocumentTypes, "- please select -")
I populate my drop down
var model = new DocumentModel();
model.DocumentTypes = GetDocumentTypes();
private static List<SelectListItem> GetDocumentTypes()
{
var items = new List<SelectListItem>
{
new SelectListItem
{Text = @"Text #1", Value = "1"},
new SelectListItem
{Text = @"Text #2", Value = "2"},
};
return items;
}
I have a controller action when the form is posted back:
[HttpPost]
public void UploadDocument(DocumentModel model)
{
if (ModelState.IsValid)
{
// I want to get the text from the dropdown
}
}
How do i get the text from my drop down list? Thanks
Upvotes: 6
Views: 24703
Reputation: 59
I stumbled here trying to find the way to get the text value out of a SelectList to display it in a format other than a DropDownList (I'm reusing my Edit ViewModel as it has all the data I required)
var text = selectList.Where(q => q.Selected == true).First().Text;
Upvotes: 1
Reputation: 218732
You may not get this easily with the default model binding. You have to a small workaround like this.
1) Add a new property to your model/viewmodel to store the selected text
public class DocumentModel
{
public int TypeID { get; set; }
public List<SelectListItem> DocumentTypes { get; set; }
public string SelctedType { set;get;}
}
2) Use Html.HiddenFor
Helper method to create a hidden variable in the form for this property
@Html.HiddenFor(x => x.SelctedType)
3) Use little javascript to override the submit ! ie; When user submits the form, Get the selected Text from the dropdown and set that value as the value of the Hidden field.
$(function () {
$("form").submit(function(){
var selTypeText= $("#TypeID option:selected").text();
$("#SelctedType").val(selTypeText);
});
});
Now in your HTTPPost
action method, This will be available in the SelectedType
property.
[HttpPost]
public void UploadDocument(DocumentModel model)
{
if(ModelState.IsValid)
{
string thatValue=model.SelectedType;
}
}
Upvotes: 19
Reputation: 4009
On your model I would have another string -
public string Selected{ get; set; }
then in your view :
@Html.DropDownListFor(model => model.Selected, new SelectList(Model.DocumentTypes, "Value", "Text"))
Upvotes: 1
Reputation: 5967
if what you want to do is to retrieve selected item then this can do the work :
var selecteItem = model.DocumentTypes.Where(item=>item.Selected).FirstOrDefault();
Cheers!
Upvotes: 2