首页 > 解决方案 > 此错误的新内容:传递到字典中的模型项的类型为“System.Collections.Generic.List`1[]

问题描述

我对 ASP.NET MVC 和 C# 很陌生。我的最后一年项目要求我使用 ASP.NET MVC c# 做一个 Web 应用程序。如果您能帮助这个新手,我将不胜感激。

我一直收到此错误,但我似乎无法找出错误或如何修复它:

传入字典的模型项的类型为“System.Collections.Generic.List`1[test2.Models.UsersModel]”,但此字典需要“test2.Models.user_account”类型的模型项。

这是我的控制器:

using System.Net;
using System.Web;
using System.Web.Mvc;
using test2.Models;
using System.Runtime.InteropServices;
using System.Net.Http;
using System.Runtime.InteropServices.WindowsRuntime;

namespace test2.Controllers
{
    //Admin page show be able to manage role 
    public class AdminController : Controller
    {
        public ActionResult Index() {
            ubdcsEntities dc = new ubdcsEntities();

            var userRoles = (from user in dc.user_account
                             select new {
                                 UserId = user.userID,
                                 Username = user.username,
                                 EmailID = user.emailID,
                                 RoleName = (from userRole in dc.userRoles
                                             join role in dc.role1 on userRole.roleID
                                             equals role.roleID
                                             select role.roleName).ToList()
                             }).ToList().Select(p => new UsersModel()
                             {
                                 Username = p.Username,
                                 EmailID = p.EmailID,
                                 RoleName = p.RoleName.ToString()
                             }).ToList();

            return View(userRoles);
        }
    }
}

我的索引 - 是的,我试图为 roleName 使用下拉列表,以便我可以从下拉列表中分配用户的角色,但它不起作用

@model IEnumerable<test2.Models.UsersModel>
@{
    ViewBag.Title = "Users With Roles";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<div class="panel panel-primary">
    <div class="panel-heading">
        <h3 class="box-title">
            <b>Users with Roles</b>
        </h3>
    </div>
    <!-- /.box-header -->
    <div class="panel-body">
        <table class="table table-hover table-bordered table-condensed" id="UsersWithRoles">
            <thead>
                <tr>
                    <td><b>Username</b></td>
                    <td><b>Email</b></td>
                    <td><b>Roles</b></td>
                </tr>
            </thead>
            @foreach (var user in Model)
            {
                <tr>
                    <td>@user.Username</td>
                    <td>@user.EmailID</td>
                    <td>
                        @user.RoleID
        @*Html.DropDownListFor(user => user.FirstOrDefault().RoleName, new SelectList(new[]{"Admin","Student", "Counselor"}))*@
                    </td>
                    

                </tr>

            }
        </table>
    </div>

    <div class="panel-footer">
        <p class="box-title"><b>Total Users till @String.Format("{0 : dddd, MMMM d, yyyy}", DateTime.Now)  : </b><span class="label label-primary">@Model.Count()</span></p>
    </div>
</div>


@section scripts{
    <script>

        $(function () {
            $('#UsersWithRoles').DataTable({
                "paging": true,
                "lengthChange": true,
                "searching": true,
                "ordering": true,
                "info": true,
                "autoWidth": true
            });
        });
    </script>
}  v>

我的模型:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace test2.Models
{
    public partial class UsersModel
    {
        public int UserID { get; set; }
        public string Username { get; set; }
        public string EmailID { get; set; }
        public int RoleID { get; set; }
        public string RoleName { get; set; }
    }
}

下面是数据库中的模型(user_account)

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated from a template.
//
//     Manual changes to this file may cause unexpected behavior in your application.
//     Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

namespace test2.Models
{
    using System;
    using System.Collections.Generic;
    
    public partial class user_account
    {
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
        public user_account()
        {
            this.calendars = new HashSet<calendar>();
        }
    
        public int userID { get; set; }
        public string username { get; set; }
        public string emailID { get; set; }
        public string password { get; set; }
        public int roleID { get; set; }
    
        public virtual user_emergency user_emergency { get; set; }
        public virtual user_profile user_profile { get; set; }
        public virtual user_record user_record { get; set; }
        public virtual counselor_account1 counselor_account1 { get; set; }
        public virtual userRole userRole { get; set; }
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<calendar> calendars { get; set; }
        public virtual role1 role { get; set; }
    }
}

使用 @model.test2.models.user_account 的视图 - 用户注册

@model test2.Models.user_account
@{
    ViewBag.Title = "Signup";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Sign in</h2>

<div>
    @using (Html.BeginForm("Signup", "Home"))
    {
        <div style="color:red;">@Html.ValidationSummary()</div>
            <!--Show details are saved successfully message-->
            <div class="col-lg-12">@ViewBag.Message</div>
        <br />

        <div class="form-horizontal">
            <hr />
            @Html.ValidationSummary(true, "", new { @class = "text-danger" })

            <div class="form-group">
                @Html.LabelFor(model => model.username, htmlAttributes: new { @class = "control-label col-md-2" })
                <div class="col-md-10">
                    @Html.EditorFor(model => model.username, new { htmlAttributes = new { @class = "form-control" } })
                    @Html.ValidationMessageFor(model => model.username, "", new { @class = "text-danger" })
                </div>
            </div>

            <div class="form-group">
                @Html.LabelFor(model => model.emailID, htmlAttributes: new { @class = "control-label col-md-2" })
                <div class="col-md-10">
                    @Html.EditorFor(model => model.emailID, new { htmlAttributes = new { @class = "form-control" } })
                    @Html.ValidationMessageFor(model => model.emailID, "", new { @class = "text-danger" })
                    @Html.ValidationMessage("EmailExist", new { @class = "text-danger" })
                </div>
            </div>

            <div class="form-group">
                @Html.LabelFor(model => model.password, htmlAttributes: new { @class = "control-label col-md-2" })
                <div class="col-md-10">
                    @Html.EditorFor(model => model.password, new { htmlAttributes = new { @class = "form-control" } })
                    @Html.ValidationMessageFor(model => model.password, "", new { @class = "text-danger" })
                </div>
            </div>

            <div class="form-group">
                @Html.LabelFor(model => model.ConfirmPassword, htmlAttributes: new { @class = "control-label col-md-2" })
                <div class="col-md-10">
                    @Html.EditorFor(model => model.ConfirmPassword, new { htmlAttributes = new { @class = "form-control" } })
                    @Html.ValidationMessageFor(model => model.ConfirmPassword, "", new { @class = "text-danger" })
                </div>
            </div>

            <div class="form-group">
                <div class="col-md-offset-2 col-md-10">
                    <input type="submit" value="Register" class="btn btn-default" />
                </div>
            </div>
        </div>
    }
    


    <div>
        @Html.ActionLink("Login", "Index", "Home")
    </div>

</div>

    @section Scripts{
        <script src="~/Scripts/jquery-3.4.1.min.js"></script>
        <script src="~/Scripts/jquery.validate.min.js"></script>
        <script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>
    }

家庭控制器

        //Return Register view
        [AllowAnonymous]
        [HttpGet]
        public ActionResult Signup()
        {
            return View();
        }

        [HttpPost]
        //[ValidateAntiForgeryToken]
        public ActionResult Signup(user_account user, int role_id)
        {
            //new code
            var claims = new List<Claim>();

            #region //Email already existt
            var isExist = IsEmailExist(user.emailID);
            if (isExist)
            {
                ModelState.AddModelError("EmailExist", "Email already exist");
                return View(user);
            }
            #endregion

            #region Password Hashing
            user.password = Crypto.Hash(user.password);
            user.ConfirmPassword = Crypto.Hash(user.ConfirmPassword);
            #endregion

            //We check if the model state is valid or not. We have used DataAnnotation attributes.
            //If any form value fails the DataAnnotation validation the model state becomes invalid.
            if (ModelState.IsValid)
            {
                #region Save to Database
                using (ubdcsEntities db = new ubdcsEntities())
                {
                    //If the model state is valid i.e. the form values passed the validation then we are storing the User's details in DB.
                    //Calling the SaveDetails method which saves the details.
                    claims.Add(new Claim(ClaimTypes.Role, role_id.ToString()));
                    db.user_account.Add(user);
                    db.SaveChanges();
                }
                #endregion

                //showing succesfully registered page
                ViewBag.Message = "User has successfully registered!";
                return View();
            }
            else
            {

                //If the validation fails, we are returning the model object with errors to the view, which will display the error messages.
                ViewBag.Message = "Invalid Request";
                return View(user);
                //return View("Signup", "Home", user);
            }
        }


        [NonAction]
        public bool IsEmailExist(string emailID)
        {
            using (ubdcsEntities dc = new ubdcsEntities())
            {
                var v = dc.user_account.Where(a => a.emailID == emailID).FirstOrDefault();
                return v != null;
            }
        }

标签: c#asp.netlinqasp.net-coreuser-roles

解决方案


推荐阅读