web-dev-qa-db-ja.com

ドロップダウンリストは、MVC3 Razorで選択した値を設定します

私のモデルは次のとおりです。

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

私のコントローラー:

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

そして、私の見解:

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

実行すると、DropDownListは設定した値を選択しません。常に最初のオプションを選択しています。

52
Raito Light

ビューモデルを使用し、ViewBagを忘れる必要があります。物事がどれほど簡単になるかがわかります。したがって、ビューモデルを定義します。

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

次に、コントローラからこのビューモデルを作成します。

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

最後に、ビューで強く型付けされたDropDownListForヘルパーを使用します。

@model MyViewModel

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

誰かがこの質問に来た場合に備えて、これは私がそれを行う方法です、リポジトリオブジェクトを忘れてください、私はリポジトリパターンを使用しています、あなたはオブジェクトコンテキストを使用してエンティティを取得できます。また、エンティティ名に注意を払わないでください。エンティティタイプActionは、MVC Actionとは何の関係もありません。

コントローラ:

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

SelectListコンストラクターの最後の変数が選択された値(オブジェクトselectedValue)であることに注意してください

次に、これはそれをレンダリングするための私の見解です:

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

私はそれが非常に簡単だと思う、これが役立つことを願っています! :)

21
Alfonso Muñoz

@Html.DropDownList()を使用する代わりに、ドロップダウンリストの構成をドリルダウンしました。これは、コントローラーではなくかみそりで実行時にドロップダウンリストの値を設定する必要がある場合に便利です。

<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

コントローラーは非常にシンプルで、次のようなものがあります。

-コントローラー

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

-表示(オプションA)

@Html.DropDownList("Profile_Id")

--View(オプションB)->リストにヌル値を送信

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

以下の行を新しい更新された作業コードに置き換えます。

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

新しい更新された作業コードを実装する

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

他の人が私と同じようにこの問題を抱えている場合に備えて、ここに正しい答えを入れたいと思います。 ViewBagが嫌いな場合は使用しないでください。ただし、問題のコードの実際の問題は、@ RickAndMSFTが指摘したのと同じ名前がモデルプロパティと選択リストの両方に使用されていることです。

DropDownListコントロールの名前を変更するだけで、次のように問題が解決するはずです。

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

関係なくコントロールと名前の衝突が発生する可能性があるため、ViewBagの使用またはViewBagの使用とは関係ありません。

5

DropDownListヘルパーのラムダ形式が好きです- MVC 3レイアウトページ、Razorテンプレート、およびDropdownList を参照してください

SelectListを使用する場合は、このバグレポートが役立つと思います- http://aspnet.codeplex.com/workitem/4932

4
Stuart

以下のコード、 get from 、行きます

コントローラ:

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

見る:

@Html.DropDownList("Person")

注:ViewBag。Personおよび@ Html.DropDownList( "Person" )名前はビューモデルと同じである必要があります

2
user1855805

IT部門を選択するには、部門がtblDepartmentテーブルからロードされるときに、SelectListクラスの次のオーバーロードされたコンストラクターを使用します。 selectedValueパラメーターに値1を渡していることに注意してください。

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

Dropdownlistforを使用したくない、または意味をなさない人のために、.NET MVCをセットアップしてjQueryでどのように実行したかを示します。

  1. フロントエンドJavascript->モデルからデータを取得:
    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. かみそりhtmlでは、ドロップダウンリストはほとんどありません
 @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)})

そして、ページの読み込み時に、js関数は@modelに保存されている値に基づいて選択されたオプションを設定します。

乾杯。

0
Lucas