dropdownlist Ustaw wybraną wartość w Mvc3 Razor

Oto mój model:

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

Mój Kontroler:

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);
}

A potem mój pogląd:

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

Kiedy uruchamiam, DropDownList nie wybiera ustawionej wartości.. Zawsze wybiera pierwszą opcję.

Author: Necreaux, 2011-07-24

10 answers

Powinieneś używać modeli widoku i zapomnieć o ViewBag myśl o tym, jakby nie istniał. Zobaczysz, jak łatwiej będzie. Zdefiniuj więc model widoku:

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

A następnie wypełnić ten model widoku z kontrolera:

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);
}

I na koniec użyj mocno wpisanegoDropDownListFor helpera:

@model MyViewModel

@Html.DropDownListFor(
    x => x.SelectedCategoryId,
    Model.Categories
)
 101
Author: Darin Dimitrov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-24 14:15:58

Na wypadek, gdyby ktoś przyszedł z tym pytaniem, tak to robię, proszę zapomnij o obiekcie repozytorium, używam wzorca repozytorium, możesz użyć kontekstu obiektu, aby pobrać encje. A także nie zwracaj uwagi na moje nazwy encji, Moja Akcja typu encja nie ma nic wspólnego z akcją MVC.

Kontroler:

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

Zwróć uwagę, że ostatnią zmienną konstruktora SelectList jest wybrana wartość (obiekt selectedValue)

To jest mój widok do renderowania:

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

Myślę, że to dość proste, mam nadzieję, że to pomoże! :)

 22
Author: Alfonso Muñoz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-15 10:52:35

Wywierciłem tworzenie rozwijanej listy zamiast używać @Html.DropDownList(). Jest to przydatne, jeśli musisz ustawić wartość rozwijanej listy w czasie wykonywania w razor zamiast kontrolera:

<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>
 13
Author: Shadi Namrouti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-03 22:30:58

Cóż to bardzo proste w kontrolerze masz coś takiego:

-- Controller

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

--View (Opcja A)

@Html.DropDownList("Profile_Id")

-- View (Opcja B) -- > Wyślij wartość null do listy

@Html.DropDownList("Profile_Id", null, "-- Choose --", new {  @class = "input-large" })
 8
Author: CXRom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-25 04:44:56

Zastąp poniższy wiersz nowym zaktualizowanym kodem roboczym:

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

Teraz zaimplementuj nowy zaktualizowany kod roboczy :

@Html.DropDownListFor(model => model.NewsCategoriesID, ViewBag.NewsCategoriesID as List<SelectListItem>, new {name = "NewsCategoriesID", id = "NewsCategoriesID" })
 6
Author: Anjan Kant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-11 22:14:19

Chcę umieścić poprawną odpowiedź tutaj, na wypadek, gdyby inni mieli ten problem, jak ja. Jeśli nie podoba Ci się ViewBag, w porządku, nie używaj go, ale prawdziwy problem z kodem w pytaniu jest taki, że ta sama nazwa jest używana zarówno dla właściwości modelu, jak i dla selectlist, jak zostało wskazane przez @RickAndMSFT

Po prostu zmiana nazwy kontrolki DropDownList powinna rozwiązać problem w następujący sposób:

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

To tak naprawdę nie ma nic wspólnego z używaniem ViewBag lub nie używać ViewBag, ponieważ możesz mieć nazwę kolizji z kontrolą niezależnie.

 5
Author: Uriah Blatherwick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-11 02:09:24

Preferuję formę lambda pomocnika DropDownList-zobacz MVC 3 Layout Page, Razor Template, and DropdownList

Jeśli chcesz użyć SelectList, to myślę, że to zgłoszenie błędu może pomóc - http://aspnet.codeplex.com/workitem/4932

 4
Author: Stuart,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:11

Code bellow, get from , goes

Kontroler:

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

Widok:

@Html.DropDownList("Person")

Uwaga: ViewBag.osoba i @ Html.DropDownList ("Person") nazwa powinna być taka jak w modelu widoku

 2
Author: user1855805,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-11 07:58:02

Aby wybrać dział IT, gdy działy są ładowane z tabeli tblDepartment, użyj następującego przeciążonego konstruktora klasy SelectList. Zauważ, że przekazujemy wartość 1 dla parametru selectedValue.

ViewBag.Departments = new SelectList(db.Departments, "Id", "Name", "1");
 1
Author: Azarsa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-10 07:26:47

Dla każdego, kto nie chce lub nie ma sensu używać dropdownlistfor, oto jak zrobiłem to w jQuery z. NET MVC skonfigurowany.

  1. Front end Javascript - > pobieranie danych z modelu:
    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. w razor html, będziesz miał kilka dropdownlist
 @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)})

I podczas ładowania strony, funkcja js ustawia wybraną opcję na podstawie wartości przechowywanej w modelu@.

Zdrówko.
 0
Author: Lucas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-03-21 21:52:31