You can build your CustomDropdownListFor with the help of a custom helper method as shown below:
Custom Helper Method:
public static class CustomHelpers
{
public class CustomSelectItem : SelectListItem
{
public string Class { get; set; }
public string Disabled { get; set; }
public string SelectedValue { get; set; }
}
public static MvcHtmlString CustomDropdownListFor(this HtmlHelper htmlHelper, Expression> expression, IEnumerable list, string selectedValue, string optionLabel, object htmlAttributes = null)
{
if (expression == null)
{
throw new ArgumentNullException("expression");
}
ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
string name = ExpressionHelper.GetExpressionText((LambdaExpression)expression);
return CustomDropdownList(htmlHelper, metadata, name, optionLabel, list, selectedValue, HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes));
}
private static MvcHtmlString CustomDropdownList(this HtmlHelper htmlHelper, ModelMetadata metadata, string name, string optionLabel, IEnumerable list, string selectedValue, IDictionary htmlAttributes)
{
string fullName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name);
if (String.IsNullOrEmpty(fullName))
{
throw new ArgumentException("name");
}
TagBuilder dropdown = new TagBuilder("select");
dropdown.Attributes.Add("name", fullName);
dropdown.MergeAttribute("data-val", "true");
dropdown.MergeAttribute("data-val-required", "Mandatory field.");
dropdown.MergeAttribute("data-val-number", "The field must be a number.");
dropdown.MergeAttributes(htmlAttributes); //dropdown.MergeAttributes(new RouteValueDictionary(htmlAttributes));
dropdown.MergeAttributes(htmlHelper.GetUnobtrusiveValidationAttributes(name, metadata));
StringBuilder options = new StringBuilder();
// Make optionLabel the first item that gets rendered.
if (optionLabel != null)
options.Append("" + optionLabel + "");
foreach (var item in list)
{
if (item.SelectedValue == "selected" && item.Disabled == "disabled")
options.Append("" + item.Text + "");
else if (item.SelectedValue != "selected" && item.Disabled == "disabled")
options.Append("" + item.Text + "");
else if (item.SelectedValue == "selected" && item.Disabled != "disabled")
options.Append("" + item.Text + "");
else
options.Append("" + item.Text + "");
}
dropdown.InnerHtml = options.ToString();
return MvcHtmlString.Create(dropdown.ToString(TagRenderMode.Normal));
}
}
View (Razor):
@Html.CustomDropdownListFor(m => m.PersonId, ViewBag.PersonData as List, null, "---- Select ----",
new { name = "personId", id = "personId"})
@Html.ValidationMessageFor(m => m.PersonId, null , new { @class = "ValidationErrors" })
Hope this helps...