Meilleure façon de régler un DropDownList dans MVC3 / Rasoir à l'aide de la méthode d'assistance

Salut, alors je suis assez nouveau à MVC3 et Rasoir et j'ai essayé d'obtenir ma tête autour de lui depuis quelques jours. J'ai été chargé d'une tâche par mon projet architecte pour créer un helper qui trie une liste déroulante dans un MVC Vue. J'ai une Vue qui récupère des données différentes à partir d'un Contrôleur et je suis de retour à certaines valeurs que je veux à apparaître dans une liste déroulante. J'ai été dit de ne pas faire le tri dans le Contrôleur et aussi à passer sur le terrain que nous voulons trier par dans la méthode d'assistance. Je pourrais faire comme ci-dessous mais l'architecte veut garder la vue gratuit de c sharp code:

@Html.DropDownListFor(model => model.StudyName, new SelectList(ViewBag.StudyTypes, "Value", "Text").OrderBy(l => l.Text))

J'ai donc créé quelques exemples de code et des méthodes d'extension pour essayer et obtenir de travailler. Mon idée est de reproduire le code Html existant.DropDownList méthode et permettre le passage de l'objet htmlAttributes' afin que je puisse régler le style dans le cadre de l'appel de méthode.

Voici mon code jusqu'à présent. Je suis de retour les données de la liste déroulante dans le ViewBag.StudyTypes dans le modification de la méthode de Contrôleur:

public ActionResult Edit(int id)
{
    IEnumerable<SelectListItem> mySelectList = new List<SelectListItem>();
    IList<SelectListItem> myList = new List<SelectListItem>();

    for (int i = 0; i < 5; i++)
    {
        myList.Add(new SelectListItem() 
            { Value = i.ToString(), Text = "My Item " + i.ToString(), Selected = i == 2 }
        );
    }

    mySelectList = myList;
    ViewBag.StudyTypes = mySelectList;

    StudyDefinition studydefinition = db.StudyDefinitions.Find(id);

    return View(studydefinition);
}

Voici mon code:

    @model MyStudyWeb.Models.StudyDefinition

@using MyStudyWeb.Helpers

@{
    ViewBag.Mode = "Edit";
}
<div>
    @Html.DropDownListSorted(new SelectList(ViewBag.StudyTypes, "Value", "Text"))<br />
    @Html.DropDownListSorted("MyList", new SelectList(ViewBag.StudyTypes, "Value", "Text"))<br />
</div>

Enfin ci-dessous sont les méthodes d'extension, je suis en train de me rendre au travail. La première méthode d'extension ne fait rien, je viens d'obtenir un espace vide à ce point dans la Vue. La deuxième méthode de travail, mais c'est moche. Pour la 3ème méthode, je ne sais pas comment spécifier un "trier par" paramètre que l'OrderBy sur un IEnumerable s'attend à une expression Linq.

namespace StudyDefinition.Helpers
{
    public static class HtmlHelperExtensions
    {
        //1st sort method: sort the passed in list and return a new sorted list
        public static SelectList DropDownListSorted(this HtmlHelper helper, IEnumerable<SelectListItem> selectList)
        {
            var x = new SelectList(selectList.ToList()).OrderBy(l => l.Text);

            return x as SelectList;
        }

        //2nd sort method: return IHtml string and create <select> list manually
        public static IHtmlString DropDownListSorted(this HtmlHelper helper, string name, SelectList selectList)
        {
            StringBuilder output = new StringBuilder();
            (selectList).OrderBy(l => l.Text);

            output.Append("<select id=" + name + " name=" + name + ">");

            foreach (var item in selectList)
            {
                output.Append("<option value=" + item.Value.ToString() + ">" + item.Text + "</option>");
            }

            output.Append("</select>");

            return MvcHtmlString.Create(output.ToString());
        }

        //3rd sort method: pass in order by parameter - how do I use this?
        public static IHtmlString DropDownListSorted(this HtmlHelper helper, string name, SelectList selectList, string orderBy)
        {
            StringBuilder output = new StringBuilder();

            //How do I use the orderBy parameter?
            (selectList).OrderBy(l => l.Text);

            output.Append("<select id=" + name + " name=" + name + ">");

            foreach (var item in selectList)
            {
                output.Append("<option value=" + item.Value.ToString() + ">" + item.Text + "</option>");
            }

            output.Append("</select>");

            return MvcHtmlString.Create(output.ToString());
        }        
    }
}

Je ne sais vraiment pas la meilleure approche à prendre, il y a peut être un moyen beaucoup plus simple que je suis totalement absente et je pourrais peut-être au point où je ne peux pas voir la forêt pour les arbres plus. Quelques questions

  • Dois-je retourner un SelectList ou un MvcHtmlString, ou tout autre chose?
  • Pour la première méthode d'extension comment puis-je obtenir le retour de l'SelectList rendre dans le point de Vue?
  • Comment puis-je passer un paramètre à mes méthodes d'extension qui spécifie l'ordre de tri?
  • Comment puis-je passer un " objet htmlAttributes paramètre, et comment dois-je appliquer cet objet /paramètre à la SelectList?

Si quelqu'un a des idées ou des suggestions, je vous en serais reconnaissant certains commentaires 🙂

OriginalL'auteur Ciaran Bruen | 2011-08-28