MVC 4 DropDownListFor Réglez l'Élément Sélectionné Basé sur le Texte
Normalement lorsque j'utilise le DropDownListFor helper je suis en sélectionnant l'élément est sélectionné en fonction d'un ID (int), mais maintenant j'ai une situation où j'ai besoin d'afficher l'élément sélectionné sur la base du texte (chaîne de caractères) et non pas une IDENTITÉ. Dans le contrôleur, le modèle est correctement réglé pour la valeur que je veux avec cette propriété:
model.Title
Un exemple de titre serait "Front Office". J'ai le code suivant dans mon Controller:
ViewBag.Titles = new SelectList(jobTitles, "Name", "Name");
et sur la vue, j'ai ceci:
@Html.DropDownListFor(model => model.Title, ViewBag.Titles as SelectList)
La DropDownList est de peupler correctement avec tous les titres d'emploi, il n'est tout simplement pas de sélectionner le bon titre de l'emploi, en fonction de modèle.De titre. Ce que je fais mal?
Mise à JOUR:
Il semble y avoir quelque chose de potentiellement va pas dans mon code, donc je suis en train de mettre tout ça ici pour voir si je fais quelque chose de mal.
Contrôleur:
public ActionResult Edit(int id = 0)
{
StaffMember staffmember = StaffMember.SelectByID(id); //gets staff member from db
ViewBag.Titles = new SelectList(JobTitle.SelectAll(), "Name", "Name", staffmember.Title); //JobTitle.SelectAll() returns List<JobTitle>
StaffEditModel model = new StaffEditModel();
model.ID = staffmember.ID;
model.ClientID = staffmember.ClientID;
model.FirstName = staffmember.FirstName;
model.MiddleInitial = staffmember.MiddleInitial;
model.LastName = staffmember.LastName;
model.Title = staffmember.Title;
model.Phone = staffmember.Phone;
model.Email = staffmember.Email;
model.Birthday = staffmember.Birthday;
model.HireDate = staffmember.HireDate;
model.Biography = staffmember.Biography;
if (staffmember == null)
{
return HttpNotFound();
}
return View(model);
}
Modèle:
public class StaffEditModel
{
public int ID { get; set; }
public int ClientID { get; set; }
[Required]
[Display(Name = "First Name")]
public string FirstName { get; set; }
[Display(Name = "Middle Initial")]
public string MiddleInitial { get; set; }
[Required]
[Display(Name = "Last Name")]
public string LastName { get; set; }
public string Title { get; set; } //this is the property I'm trying to show in DropDown
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")]
public string Birthday { get; set; }
[Display(Name = "Hire Date")]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")]
public string HireDate { get; set; }
public string Email { get; set; }
[MaxLength(14)]
public string Phone { get; set; }
public string Biography { get; set; }
}
Vue:
@Html.DropDownListFor(model => model.Title, new SelectList(ViewBag.Titles,"Value","Text", Model.Title))
- Est-ce que votre
JobTitle.SelectAll()
retourneList<string>
? Ou un autre type d'objet?
Vous devez vous connecter pour publier un commentaire.
Cela devrait fonctionner.
Vous pouvez passer
ViewBag.Titles
commeList<SelectListItem>
de contrôleur depuis dans la vue,
List<SelectListItem>
et en utilisant le code suivant dans la Vue:@Html.DropDownListFor(model => model.Title, new SelectList(ViewBag.Titles, "Text", "Text", Model.Title))
mais obtenir les mêmes résultats que j'étais avant où il ne sélectionnez pas l'article que je suis à la recherche pour. Pour la liste déroulante valeur et la texte sont les mêmes.Je sais je suis en retard à la fête, mais j'ai eu un problème similaire et je pensais que je voudrais ajouter à ce que j'ai trouvé.
Je n'ai pas compris le pourquoi encore - je suis encore en recherche (voilà comment j'ai atterri ici) - mais je pense qu'il a quelque chose à voir avec le fait que vous êtes en utilisant le mot Titre
J'ai exactement le même scénario et dès que j'ai changé de modèle à CustomerTitle au lieu de Titre les choses fonctionnaient comme prévu.
Premières impressions sont que le modèle de liaison est de trouver Titre quelque part d'autre dans le DOM et l'obtention de trébucher. Complet de la spéculation. Si j'ai plus de temps je vais continuer à creuser pour le pourquoi