Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 您如何编写“一个”的代码;创建;模型的视图?_C#_.net_Asp.net Mvc_Razor - Fatal编程技术网

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”无效。