31 votes

Définir la valeur sélectionnée dans SelectList après instanciation

Ai-je raison de penser qu'il n'y a aucun moyen de définir la valeur sélectionnée dans la classe C # SelectList après sa création? N'est-ce pas un peu idiot?

19voto

awrigley Points 6468

Je pense que vous vous battez le cadre. Les données qui vont dans votre point de vue doit être créé à la Dernière Minute (LPM).

Penser de cette façon, un SelectList est un type de nourrir l' DropDownList helper HTML. Il n'est PAS un endroit pour stocker des données pendant que vous décidez comment le traiter.

Une meilleure solution serait de récupérer vos données en List<T> puis initialiser l' SelectList(s) lorsque vous en avez besoin. Un avantage immédiat de cette pratique est qu'il vous permet de réutiliser votre List<T> pour plus d'un DropDownList, tels que:

Country of birth
Country of residence

Ces SelectLists utilisent tous les Pays de la liste de type List<Country>.

Vous pouvez utiliser votre List<T> à la "dernière minute", comme dans cet exemple:

public class TaxCheatsFormViewModel
{
    private List<Country> countries { get; set; }

    public TaxCheat Cheat { get; private set; }
    public SelectList CountryOfBirth { get; private set; }
    public SelectList CountryOfResidence { get; private set; }
    public SelectList CountryOfDomicile { get; private set; }

    public TaxCheatsFormViewModel(TaxCheat baddie)
    {
        TaxCheat = baddie;
        countries = TaxCheatRepository.GetList<Country>();
        CountryOfBirth = new SelectList(countries, baddie.COB);
        CountryOfResidence = new SelectList(countries, baddie.COR);
        CountryOfDomicile = new SelectList(countries, baddie.COD);
    }
}

Le point est que vous devez garder vos données en List<T> jusqu'à ce que vous vraiment besoin d'un fichier de sortie; à la dernière minute (LPM).

4voto

eudaimos Points 460

Parce que c'est tel résultat dans Google, je donne ce que j'ai trouvé ici de travailler (en dépit de l'âge):

Si vous utilisez une Vue Fortement typée (c'est à dire le Modèle est affecté un type), la SelectedValue fourni par le Constructeur de la SelectList est remplacé par la valeur de l'objet utilisé pour le Modèle de la page.

Cela fonctionne bien sur une page d'édition, mais pas pour Créer quand vous voulez présélectionner une valeur spécifique, donc une solution de contournement consiste simplement à affecter la bonne valeur par défaut de l'objet construit vous passez à la vue comme Modèle. par exemple

var model = new SubjectViewModel()
{
   Subject = new Subject(),
   Types = data.SubjectTypes.ToList()
}
model.Subject.SubjectType = model.Types.FirstOrDefault(t => t.Id == typeId);
ViewData.Model = model;
return View();

donc le code dans ma Créer la Vue qui ressemble à ceci:

Html.DropDownListFor(model => model.Subject.SubjectTypeId, new SelectList(model.Types, "Id", "Name"))

retourne la Liste Déroulante avec la valeur que j'ai désigné comme SelectedValue dans la liste.

4voto

JoeSharp Points 188

Je sais que c'est une vieille question, mais cela pourrait aider quelqu'un là-bas. J'ai fait ce qui semble être proche de ce qu'a fait Erik. Je viens de créer une nouvelle SelectList à partir de ma existante ...

 SelectList myList = GetMySelectList();
SelectListItem selected = myList.FirstOrDefault(x => x.Text.ToUpper().Contains("UNITED STATES"));
if (selected != null)
{
     myList = new SelectList(myList, "value", "text", selected.Value);
}
 

3voto

GalacticCowboy Points 8185

La propriété "SelectedValue" est en lecture seule. Le définir dans le constructeur est le seul moyen.

Tor, la SelectList est une construction ASP.NET MVC utilisée pour créer une liste déroulante. Le faire à votre façon devrait également fonctionner, mais la SelectList devrait le faire pour vous (et non dans JS) si elle est effectuée correctement.

1voto

Ben Mills Points 5424

Je pense que vous pouvez le faire dans le contrôleur. Si vous allez rendre une liste déroulante avec le nom/ID StateCode, alors vous pouvez définir l'état sélectionné à l'aide de ce code après la SelectList est créé:

ViewData["StateCode"] = "VT";

Il semble que la liste déroulante HTML helper recherche un ViewData élément avec le même nom que la liste déroulante qui est en cours de création.

Je ne pense pas que j'aime utiliser cette technique, mais il ne semble pas fonctionner.

Je suis d'accord que le SelectList classe est un peu faible pour le moment. Je voudrais être en mesure de créer un SelectList puis sélectionnez une valeur plus tard en soit la valeur ou le texte.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X