C# 您如何编写“一个”的代码;创建;模型的视图?
我在菜单模型中有一个名为C# 您如何编写“一个”的代码;创建;模型的视图?,c#,.net,asp.net-mvc,razor,C#,.net,Asp.net Mvc,Razor,我在菜单模型中有一个名为角色的多对多字段,我正在尝试为模型创建一个“创建”视图 我的创建操作方法: public ActionResult Create() { ViewBag.ParentMenuId = new SelectList(_db.Menus, "Id", "Name"); ViewBag.Roles = new SelectList(_db.UserRoles.ToList(), "Id", "Name"); ret
角色的多对多
字段,我正在尝试为模型创建一个“创建”视图
我的创建操作方法:
public ActionResult Create()
{
ViewBag.ParentMenuId = new SelectList(_db.Menus, "Id", "Name");
ViewBag.Roles = new SelectList(_db.UserRoles.ToList(), "Id", "Name");
return View();
}
[HttpPost]
public ActionResult Create(Menu menu)
{
if (ModelState.IsValid)//the state is always **invalid**
{
_db.Menus.Add(menu);
_db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.ParentMenuId = new SelectList(_db.Menus, "Id", "Name", menu.ParentMenuId);
return View(menu);
}
我的视图(Create.cshtml):
@LabelFor(model=>model.Roles,“Roles”)
@Html.ListBox(“角色”)
@Html.ValidationMessageFor(model=>model.Roles)
如何修复它?我得到以下错误:
具有键“”的ViewData项的类型为“”,但必须为“IEnumerable”
嗯,错误消息相当清楚,您需要一个IEnumerable
因此,请更改您的ViewBag.Roles定义
new SelectList(_db.UserRoles.ToList(), "Id", "Name");
到
编辑
在你看来:
@Html.ListBox("Roles", (IEnumerable<SelectListItem>)ViewBag.Roles)
并在操作代码中“手动”处理每个选定角色
编辑
ViewModel示例(不按原样工作)
在你看来,你需要
- 下拉列表(ParentMenuId)
- 列表框(RoleIDs)
- 此列表框的结果(post操作的模型绑定)
- 菜单类的其他属性(可能不是全部)
我们的想法是创建一个
public class MenuViewModel
{
public IEnumerable<SelectListItem> ParentMenuList {get;set;}//a dropDown
public IEnumerable<SelectListItem> RoleList {get;set;}//a listBox
public string Name {get;set;}//the menu name //the menu name
public List<int> SelectedRoles {get;set;}
}
您的视图将具有MenuViewModel。。。作为榜样
@model MenuViewModel
//your other code
//the listbox
<div class="editor-label">
@Html.LabelFor(model => model.SelectedRoles, "Roles")
</div>
<div class="editor-field">
@Html.ListBoxFor(m => m.SelectedRoles, Model.RoleList)
@Html.ValidationMessageFor(model => model.Roles)
</div>
Pro ViewModel:
- 你只是在使用你需要的属性
- 您不需要ViewBag(避免它很好:它是动态的,不是强类型的,所以…很难测试,重构问题等等)
- 一切都在视图的模型中
Cons视图模型:
- 您必须在get操作中将模型映射到ViewModel,并在post操作中将模型从ViewModel映射到模型,但是。。。价格更糟李>
嗯,错误信息相当清楚,您需要一个IEnumerable
因此,请更改您的ViewBag.Roles定义
new SelectList(_db.UserRoles.ToList(), "Id", "Name");
到
编辑
在你看来:
@Html.ListBox("Roles", (IEnumerable<SelectListItem>)ViewBag.Roles)
并在操作代码中“手动”处理每个选定角色
编辑
ViewModel示例(不按原样工作)
在你看来,你需要
- 下拉列表(ParentMenuId)
- 列表框(RoleIDs)
- 此列表框的结果(post操作的模型绑定)
- 菜单类的其他属性(可能不是全部)
我们的想法是创建一个
public class MenuViewModel
{
public IEnumerable<SelectListItem> ParentMenuList {get;set;}//a dropDown
public IEnumerable<SelectListItem> RoleList {get;set;}//a listBox
public string Name {get;set;}//the menu name //the menu name
public List<int> SelectedRoles {get;set;}
}
您的视图将具有MenuViewModel。。。作为榜样
@model MenuViewModel
//your other code
//the listbox
<div class="editor-label">
@Html.LabelFor(model => model.SelectedRoles, "Roles")
</div>
<div class="editor-field">
@Html.ListBoxFor(m => m.SelectedRoles, Model.RoleList)
@Html.ValidationMessageFor(model => model.Roles)
</div>
Pro ViewModel:
- 你只是在使用你需要的属性
- 您不需要ViewBag(避免它很好:它是动态的,不是强类型的,所以…很难测试,重构问题等等)
- 一切都在视图的模型中
Cons视图模型:
- 您必须在get操作中将模型映射到ViewModel,并在post操作中将模型从ViewModel映射到模型,但是。。。价格更糟李>
我创建了同一个项目,但我没有得到那个错误
listbox的模型似乎绑定到了另一种类型,请尝试明确指定viewbag模型,如下所示:
@Html.ListBox("Roles",ViewBag.Roles as SelectList)
[HttpPost]
public ActionResult Create(Menu menu)
{
if (ModelState.IsValid)//the state is always **invalid**
{
_db.Menus.Add(menu);
_db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.ParentMenuId = new SelectList(_db.Menus, "Id", "Name", menu.ParentMenuId);
ViewBag.Roles = new SelectList(_db.UserRoles.ToList(), "Id", "Name");
return View(menu);
}
并在[HttpPost]方法中尝试添加存在于Create-get方法中的ViewBag.Roles,如下所示:
@Html.ListBox("Roles",ViewBag.Roles as SelectList)
[HttpPost]
public ActionResult Create(Menu menu)
{
if (ModelState.IsValid)//the state is always **invalid**
{
_db.Menus.Add(menu);
_db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.ParentMenuId = new SelectList(_db.Menus, "Id", "Name", menu.ParentMenuId);
ViewBag.Roles = new SelectList(_db.UserRoles.ToList(), "Id", "Name");
return View(menu);
}
我正在创建同一个项目,但我没有得到那个错误
listbox的模型似乎绑定到了另一种类型,请尝试明确指定viewbag模型,如下所示:
@Html.ListBox("Roles",ViewBag.Roles as SelectList)
[HttpPost]
public ActionResult Create(Menu menu)
{
if (ModelState.IsValid)//the state is always **invalid**
{
_db.Menus.Add(menu);
_db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.ParentMenuId = new SelectList(_db.Menus, "Id", "Name", menu.ParentMenuId);
ViewBag.Roles = new SelectList(_db.UserRoles.ToList(), "Id", "Name");
return View(menu);
}
并在[HttpPost]方法中尝试添加存在于Create-get方法中的ViewBag.Roles,如下所示:
@Html.ListBox("Roles",ViewBag.Roles as SelectList)
[HttpPost]
public ActionResult Create(Menu menu)
{
if (ModelState.IsValid)//the state is always **invalid**
{
_db.Menus.Add(menu);
_db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.ParentMenuId = new SelectList(_db.Menus, "Id", "Name", menu.ParentMenuId);
ViewBag.Roles = new SelectList(_db.UserRoles.ToList(), "Id", "Name");
return View(menu);
}
可能“我的视图”-是您的局部视图,您能提供创建视图的完整代码吗?@testCoder否,不是局部视图可能“我的视图”-是您的局部视图,您能提供创建视图的完整代码吗?@testCoder否,不是局部视图您试过吗<代码>\u db.UserRoles.Select(m=>newselectListItem{Value=m.Id,Name=m.Name})代码>显然无法工作,仍然无法工作,列表框显示“System.Web.Mvc.SelectListItem System.Web.Mvc.SelectListItem System.Web.Mvc.SelectListItem”列表不工作,回发模型中的角色字段为空,错误消息值“1,3”无效。@Kevin顺便说一下,使用ViewModel会让事情变得更简单。让我们看看你有没有试过这个<代码>\u db.UserRoles.Select(m=>newselectListItem{Value=m.Id,Name=m.Name})代码>显然无法工作,仍然无法工作,列表框显示“System.Web.Mvc.SelectListItem System.Web.Mvc.SelectListItem System.Web.Mvc.SelectListItem”列表不工作,回发模型中的角色字段为空,错误消息值“1,3”无效。@Kevin顺便说一下,使用ViewModel会使事情变得更简单。让我们看看回发模型中的角色字段为空,错误消息值“1,3”无效。
。回发模型中的角色字段为空,错误消息值“1,3”无效。
。