私のモデルは次のとおりです。
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
は設定した値を選択しません。常に最初のオプションを選択しています。
ビューモデルを使用し、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
)
誰かがこの質問に来た場合に備えて、これは私がそれを行う方法です、リポジトリオブジェクトを忘れてください、私はリポジトリパターンを使用しています、あなたはオブジェクトコンテキストを使用してエンティティを取得できます。また、エンティティ名に注意を払わないでください。エンティティタイプ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>
私はそれが非常に簡単だと思う、これが役立つことを願っています! :)
@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>
コントローラーは非常にシンプルで、次のようなものがあります。
-コントローラー
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" })
以下の行を新しい更新された作業コードに置き換えます。
@Html.DropDownList("NewsCategoriesID", (SelectList)ViewBag.NewsCategoriesID)
新しい更新された作業コードを実装する:
@Html.DropDownListFor(model => model.NewsCategoriesID, ViewBag.NewsCategoriesID as List<SelectListItem>, new {name = "NewsCategoriesID", id = "NewsCategoriesID" })
他の人が私と同じようにこの問題を抱えている場合に備えて、ここに正しい答えを入れたいと思います。 ViewBagが嫌いな場合は使用しないでください。ただし、問題のコードの実際の問題は、@ RickAndMSFTが指摘したのと同じ名前がモデルプロパティと選択リストの両方に使用されていることです。
DropDownListコントロールの名前を変更するだけで、次のように問題が解決するはずです。
@Html.DropDownList("NewsCategoriesSelection", (SelectList)ViewBag.NewsCategoriesID)
関係なくコントロールと名前の衝突が発生する可能性があるため、ViewBagの使用またはViewBagの使用とは関係ありません。
DropDownListヘルパーのラムダ形式が好きです- MVC 3レイアウトページ、Razorテンプレート、およびDropdownList を参照してください
SelectListを使用する場合は、このバグレポートが役立つと思います- http://aspnet.codeplex.com/workitem/4932
以下のコード、 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" )名前はビューモデルと同じである必要があります
IT部門を選択するには、部門がtblDepartmentテーブルからロードされるときに、SelectListクラスの次のオーバーロードされたコンストラクターを使用します。 selectedValueパラメーターに値1を渡していることに注意してください。
ViewBag.Departments = new SelectList(db.Departments, "Id", "Name", "1");
Dropdownlistforを使用したくない、または意味をなさない人のために、.NET MVCをセットアップしてjQueryでどのように実行したかを示します。
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);
});
}
@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に保存されている値に基づいて選択されたオプションを設定します。
乾杯。