web-dev-qa-db-fra.com

liste déroulante définir la valeur sélectionnée dans MVC3 Razor

Voici mon modèle:

public class NewsCategoriesModel {
    public int NewsCategoriesID { get; set; }        
    public string NewsCategoriesName { get; set; }
}

Mon contrôleur:

public ActionResult NewsEdit(int ID, dms_New dsn) {
    dsn = (from a in dc.dms_News where a.NewsID == ID select a).FirstOrDefault();
    var categories = (from b in dc.dms_NewsCategories select b).ToList();
    var selectedValue = dsn.NewsCategoriesID;
    SelectList ListCategories = new SelectList(categories, "NewsCategoriesID", "NewsCategoriesName",selectedValue);

    // ViewBag.NewsCategoriesID = new SelectList(categories as IEnumerable<dms_NewsCategory>, "NewsCategoriesID", "NewsCategoriesName", dsn.NewsCategoriesID);
    ViewBag.NewsCategoriesID = ListCategories;
    return View(dsn);
}

Et puis ma vue:

@Html.DropDownList("NewsCategoriesID", (SelectList)ViewBag.NewsCategoriesID)

Quand je cours, le DropDownList ne sélectionne pas la valeur que j'ai définie. Il sélectionne toujours la première option.

52
Raito Light

Vous devriez utiliser les modèles de vue et oublier ViewBag Pensez-y comme si cela n'existait pas. Vous verrez comme les choses vont devenir plus faciles. Définissez donc un modèle de vue:

public class MyViewModel
{
    public int SelectedCategoryId { get; set; }
    public IEnumerable<SelectListItem> Categories { get; set; } 
}

puis renseignez ce modèle de vue à partir du contrôleur:

public ActionResult NewsEdit(int ID, dms_New dsn)
{
    var dsn = (from a in dc.dms_News where a.NewsID == ID select a).FirstOrDefault();
    var categories = (from b in dc.dms_NewsCategories select b).ToList();

    var model = new MyViewModel
    {
        SelectedCategoryId = dsn.NewsCategoriesID,
        Categories = categories.Select(x => new SelectListItem
        {
            Value = x.NewsCategoriesID.ToString(),
            Text = x.NewsCategoriesName
        })
    };
    return View(model);
}

enfin, à votre avis, utilisez l’aide DropDownListFor fortement typée:

@model MyViewModel

@Html.DropDownListFor(
    x => x.SelectedCategoryId,
    Model.Categories
)
99
Darin Dimitrov

juste au cas où quelqu'un viendrait avec cette question, voici comment je le fais. S'il vous plaît, oubliez l'objet de référentiel. J'utilise le modèle de référentiel. Vous pouvez utiliser votre contexte d'objet pour récupérer les entités. Et aussi ne faites pas attention à mes noms d'entité, mon type d'entité Action n'a rien à voir avec une Action MVC.

Manette:

ViewBag.ActionStatusId = new SelectList(repository.GetAll<ActionStatus>(), "ActionStatusId", "Name", myAction.ActionStatusId);

Veillez à ce que la dernière variable du constructeur SelectList soit la valeur sélectionnée (object selectedValue)

Alors voici mon point de vue pour le rendre:

<div class="editor-label">
   @Html.LabelFor(model => model.ActionStatusId, "ActionStatus")
</div>
<div class="editor-field">
   @Html.DropDownList("ActionStatusId")
   @Html.ValidationMessageFor(model => model.ActionStatusId)
</div> 

Je pense que c'est assez simple, j'espère que cela aide! :)

21
Alfonso Muñoz

J'ai exploré la formation de la liste déroulante au lieu d'utiliser @Html.DropDownList(). Ceci est utile si vous devez définir la valeur de la liste déroulante lors de l'exécution en rasoir à la place du contrôleur:

<select id="NewsCategoriesID" name="NewsCategoriesID">
    @foreach (SelectListItem option in ViewBag.NewsCategoriesID)
    {
        <option value="@option.Value" @(option.Value == ViewBag.ValueToSet ? "selected='selected'" : "")>@option.Text</option>

    }
</select>
10
Shadi Namrouti

Eh bien c'est très simple dans le contrôleur, vous avez quelque chose comme ça:

-- Manette

ViewBag.Profile_Id = new SelectList(db.Profiles, "Id", "Name", model.Profile_Id);

--View (Option A)

@Html.DropDownList("Profile_Id")

--View (Option B) -> Envoyer une valeur null à la liste

@Html.DropDownList("Profile_Id", null, "-- Choose --", new {  @class = "input-large" })
8
CXRom

Remplacez la ligne ci-dessous par le nouveau code de travail mis à jour:

@Html.DropDownList("NewsCategoriesID", (SelectList)ViewBag.NewsCategoriesID)

Maintenant implémenter un nouveau code de travail mis à jour:

@Html.DropDownListFor(model => model.NewsCategoriesID, ViewBag.NewsCategoriesID as List<SelectListItem>, new {name = "NewsCategoriesID", id = "NewsCategoriesID" })
6
Anjan Kant

Je veux mettre la bonne réponse ici, juste au cas où d'autres auraient ce problème comme moi. Si vous détestez le ViewBag, ne l'utilisez pas, mais le vrai problème avec le code de la question est que le même nom est utilisé à la fois pour la propriété du modèle et pour la liste de sélection, comme l'a souligné @RickAndMSFT.

Changer simplement le nom du contrôle DropDownList devrait résoudre le problème, comme suit:

@Html.DropDownList("NewsCategoriesSelection", (SelectList)ViewBag.NewsCategoriesID)

Cela n'a vraiment rien à voir avec l'utilisation du ViewBag ou de ne pas l'utiliser, car vous pouvez avoir une collision de nom avec le contrôle.

5
Uriah Blatherwick

Je préfère la forme lambda de l'assistant DropDownList - voir page de présentation MVC 3, modèle Razor et liste déroulante

Si vous voulez utiliser la liste de sélection, alors je pense que ce rapport de bogue pourrait aider - http://aspnet.codeplex.com/workitem/4932

4
Stuart

le code ci-dessous, obtenir de , va

Manette:

int DefaultId = 1;
ViewBag.Person = db.XXXX
        .ToList()
        .Select(x => new SelectListItem {
            Value = x.Id.ToString(),
            Text = x.Name,
            Selected = (x.Id == DefaultId)
        });

Vue:

@Html.DropDownList("Person")

Remarque: ViewBag. Person et @ Html.DropDownList (" Person " ) nom doit être comme dans le modèle de vue

2
user1855805

Pour que le service informatique soit sélectionné, lorsque les départements sont chargés à partir de la table tblDepartment, utilisez le constructeur surchargé de la classe SelectList suivant. Notez que nous passons une valeur de 1 pour le paramètre selectedValue.

ViewBag.Departments = new SelectList(db.Departments, "Id", "Name", "1");
1
Azarsa

Pour ceux qui ne veulent pas ou n'ont pas de sens à utiliser dropdownlistfor, voici comment je l'ai fait dans jQuery avec la configuration de .NET MVC.

  1. Javascript frontal -> obtention des données du modèle:
    var settings = @Html.Raw(Json.Encode(Model.GlobalSetting.NotificationFrequencySettings)); 

    SelectNotificationSettings(settings);

    function SelectNotificationSettings(settings) {
                $.each(settings, function (i, value) {
                    $("#" + value.NotificationItemTypeId + " option[value=" + value.NotificationFrequencyTypeId + "]").prop("selected", true);
                });
    }
  1. En rasoir HTML, vous aurez peu de liste déroulante
 @Html.DropDownList(NotificationItemTypeEnum.GenerateSubscriptionNotification.ToString,
    notificationFrequencyOptions, optionLabel:=DbRes.T("Default", "CommonLabels"),
    htmlAttributes:=New With {.class = "form-control notification-item-type", .id = Convert.ToInt32(NotificationItemTypeEnum.GenerateSubscriptionNotification)})

Et lors du chargement de la page, votre fonction js va définir l’option sélectionnée en fonction de la valeur stockée dans @model.

À votre santé.

0
Lucas