私はモデルがあります:
public class DbUserRole
{
public int UserRoleId { get; set; }
public string UserRole { get; set; }
}
public class DbUserRoles
{
public List<DbUserRole> GetRoles()
{
BugnetReports RoleDropDown = new BugnetReports();
List<DbUserRole> Roles = new List<DbUserRole>();
DataSet table = RoleDropDown.userRoleDropDown();
foreach (DataRow item in table.Tables[0].Rows)
{
DbUserRole ur = new DbUserRole();
ur.UserRole = Convert.ToString(item["UserRoleName"]);
ur.UserRoleId = Convert.ToInt32(item["UserRoleID"]);
Roles.Add(ur);
}
return Roles;
}
}
そして、これがビューをロードするControllerです。
//
// GET: /Admin/AddNewUser
public ActionResult AddNewUser()
{
DbUserRoles Roles = new DbUserRoles();
return View(Roles.GetRoles());
}
以下のように@foreach
ループを使ってリストの項目を表示させることができます。
@foreach (var item in Model)
{
<tr>
<td>
@item.UserRoleId
</td>
<td>
@item.UserRole
</td>
</tr>
}
しかし、どのようにしてパススルーされたモデルをドロップダウンリストに追加するのですか、私は試してみました
@Html.DropDownListFor(x => x.UserRole)
しかし、私は運がありません。
ビジネスロジックをビューモデルに分けることができるので、ビューをより明確に分離できます。
最初に、ユーザーがDropDown
に表示される項目のリストとともに選択するIDを格納するためのビューモデルを作成します。
ViewModel:
public class UserRoleViewModel
{
// Display Attribute will appear in the Html.LabelFor
[Display(Name = "User Role")]
public int SelectedUserRoleId { get; set; }
public IEnumerable<SelectListItem> UserRoles { get; set; }
}
参考文献:
コントローラの内部で、あなたのUserRole
リストを取得し、それをビューに表示される形式に変換するためのメソッドを作成します。
コントローラ:
private IEnumerable<SelectListItem> GetRoles()
{
var dbUserRoles = new DbUserRoles();
var roles = dbUserRoles
.GetRoles()
.Select(x =>
new SelectListItem
{
Value = x.UserRoleId.ToString(),
Text = x.UserRole
});
return new SelectList(roles, "Value", "Text");
}
public ActionResult AddNewUser()
{
var model = new UserRoleViewModel
{
UserRoles = GetRoles()
};
return View(model);
}
参考文献:
ビューモデルが作成されたので、プレゼンテーションロジックは単純化されました。
見る:
@model UserRoleViewModel
@Html.LabelFor(m => m.SelectedUserRoleId)
@Html.DropDownListFor(m => m.SelectedUserRoleId, Model.UserRoles)
参考文献:
これは作り出すでしょう:
<label for="SelectedUserRoleId">User Role</label>
<select id="SelectedUserRoleId" name="SelectedUserRoleId">
<option value="1">First Role</option>
<option value="2">Second Role</option>
<option value="3">Etc...</option>
</select>
@Html.DropDownList("ddl",Model.Select(item => new SelectListItem
{
Value = item.RecordID.ToString(),
Text = item.Name.ToString(),
Selected = "select" == item.RecordID.ToString()
}))
1つの方法があります。
<select name="listbox" id="listbox">
@foreach (var item in Model)
{
<option value="@item.UserRoleId">
@item.UserRole
</option>
}
</select>
に近いもの:
@Html.DropDownListFor(m => m.UserRole,
new SelectList(Model.Roles, "UserRoleId", "UserRole", Model.Roles.First().UserRoleId),
new { /* any html attributes here */ })
DropDownListForを設定するには、SelectListが必要です。必要なHTML属性については、次のものを追加できます。
new { @class = "DropDown", @id = "dropdownUserRole" }
List<UserRole>
の代わりに、ModelにSelectList<UserRole>
を含めることができます。また、選択したUserRoleのId値を格納するためのプロパティSelectedUserRoleId
を追加します。
SelectListに入力してから、Viewで使用します。
@Html.DropDownListFor(x => x.SelectedUserRoleId, x.UserRole)
そして、あなたは大丈夫なはずです。
http://msdn.Microsoft.com/ja-jp/library/system.web.mvc.selectlist(v = vs. 108).aspx も参照してください。
DropDownListFor
への呼び出しには、それを具体化するためのさらにいくつかのパラメーターが必要です。次のSO質問のように、SelectListが必要です。
あなたがそこに持っているもので、あなたはそれをリストをどこからロードするのではなく、どこにデータを格納するのかを言っただけです。
@{
List<CategoryModel> CategoryList = CategoryModel.GetCategoryList(UserID);
IEnumerable<SelectListItem> CategorySelectList = CategoryList.Select(x => new SelectListItem() { Text = x.CategoryName.Trim(), Value = x.CategoryID.Trim() });
}
<tr>
<td>
<B>Assigned Category:</B>
</td>
<td>
@Html.DropDownList("CategoryList", CategorySelectList, "Select a Category (Optional)")
</td>
</tr>
私はあなたがUsersモデルを持っているかのようにこれに取り組みます。
Users.cs
public class Users
{
[Key]
public int UserId { get; set; }
[Required]
public string UserName { get; set; }
public int RoleId { get; set; }
[ForeignKey("RoleId")]
public virtual DbUserRoles DbUserRoles { get; set; }
}
データベース内のその名前でテーブルを表したDbUserRolesモデル
DbUserRoles.cs
public partial class DbUserRoles
{
[Key]
public int UserRoleId { get; set; }
[Required]
[StringLength(30)]
public string UserRole { get; set; }
}
クリーンアップしたら、次のようにしてControllerにUserRolesのコレクションを作成して入力できるようになります。
var userRoleList = GetUserRolesList();
ViewData["userRoles"] = userRolesList;
そしてこれらの支持機能を持っている:
private static SelectListItem[] _UserRolesList;
/// <summary>
/// Returns a static category list that is cached
/// </summary>
/// <returns></returns>
public SelectListItem[] GetUserRolesList()
{
if (_UserRolesList == null)
{
var userRoles = repository.GetAllUserRoles().Select(a => new SelectListItem()
{
Text = a.UserRole,
Value = a.UserRoleId.ToString()
}).ToList();
userRoles.Insert(0, new SelectListItem() { Value = "0", Text = "-- Please select your user role --" });
_UserRolesList = userRoles.ToArray();
}
// Have to create new instances via projection
// to avoid ModelBinding updates to affect this
// globally
return _UserRolesList
.Select(d => new SelectListItem()
{
Value = d.Value,
Text = d.Text
})
.ToArray();
}
Repository.cs
上記の関数のMy Repository関数GetAllUserRoles()
public class Repository
{
Model1 db = new Model1(); // Entity Framework context
// User Roles
public IList<DbUserRoles> GetAllUserRoles()
{
return db.DbUserRoles.OrderBy(e => e.UserRoleId).ToList();
}
}
AddNewUser.cshtml
それからあなたの意見でこれをしなさい:
<table>
<tr>
<td>
@Html.EditorFor(model => model.UserName,
htmlAttributes: new { @class = "form-control" }
)
</td>
<td>
@Html.DropDownListFor(model => model.RoleId,
new SelectList( (IEnumerable<SelectListItem>)ViewData["userRoles"], "Value", "Text", model.RoleId),
htmlAttributes: new { @class = "form-control" }
)
</td>
</tr>
</table>