首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MVC5 MVCGRID Linq倍数表

MVC5 MVCGRID Linq倍数表
EN

Stack Overflow用户
提问于 2016-04-01 11:05:45
回答 2查看 293关注 0票数 0

我正在使用ASPNET MVC5,我只是按照本教程学习:http://www.c-sharpcorner.com/UploadFile/4d9083/creating-simple-grid-in-mvc-using-grid-mvc/,它工作得很好。现在我想用两个表(用户和角色)更新我的HomeController,注意:我的数据文本包含两个表(用户和角色)

HomeController.cs

代码语言:javascript
复制
 public ActionResult Details()
        {
            DataClassesUserDataContext db = new DataClassesUserDataContext();
            var SchemeList = from d in db.AspNetUsers
                             join i in db.AspNetUserRoles
                               on d.Id equals i.UserId
                             select new { AspNetUsers = d, AspNetUserRole = i };
            return View(SchemeList);
        }

我还好我的结果

在我看来:

My Details.cshtml 是问题所在吗?我能打电话给shanuMVCUserRoles.DB.AspNetUser & AspNetUserRoles?吗?

代码语言:javascript
复制
@model IEnumerable <shanuMVCUserRoles.DB.AspNetUser>
// possible to add other models here ? @model IEnumerable <shanuMVCUserRoles.DB.AspNetUserRole >


  >  <div
    > class="code-cut">
    >     @Html.Grid(Model).Columns(columns => {
    >     columns.Add(c => c.UserName).Titled("UserName").Filterable(true);
    >     columns.Add(c => c.Id).Titled("ID").Filterable(true);
    >     columns.Add(c => c.PasswordHash).Titled("PasswordHash").Filterable(true);
    >     columns.Add(c => c.Email).Titled("Email").Filterable(true);
    >     columns.Add(c => c.AccessFailedCount).Titled("AccessFailedCount").Filterable(true);
    >     columns.Add(c => c.PhoneNumber).Titled("PhoneNumber").Filterable(true);
    >     columns.Add()
    >     .Encoded(false)
    >     .Sanitized(false)
    >     .SetWidth(30)
    >     .RenderValueAs(o => Html.ActionLink("Edit", "Edit", new { id = o.Id })); }).WithPaging(10).Sortable(true) </div>

我有以下错误:传入字典的模型项为'System.Data.Linq.DataQuery1[<>f__AnonymousType42shanuMVCUserRoles.DB.AspNetUser,shanuMVCUserRoles.DB.AspNetUserRole]',但该字典需要一个类型为'System.Collections.Generic.IEnumerable`1shanuMVCUserRoles.DB.AspNetUser'.的模型项

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-01 11:48:47

您可以通过将AspNetUserRoles集合放入ViewBag来解决这个问题。此链接显示了此解决方案以及其他解决方案:http://www.codeproject.com/Articles/687061/Multiple-Models-in-a-View-in-ASP-NET-MVC-MVC

就我个人而言,我认为模型是我的控制器和我的视图之间的一种契约,所以我不喜欢将业务信息放在模型之外。例如,可以存储一个字符串来格式化DateTimes到ViewBag中。但是,如果我想要一个Controller和一个视图来管理用户和角色,我希望它对我和其他阅读代码的人来说是清楚的,这可能发生在今天、明天或十年之后。

因此,在本例中,我将创建一个Model类:

代码语言:javascript
复制
namespace WebApplication1.Models
{
    public class UsersAndRolesModel
    {
        public IList<shanuMVCUserRoles.DB.AspNetUser> Users { get; set; }
        public IList<shanuMVCUserRoles.DB.AspNetRole> Roles { get; set; }
    }
}

我会创建它并在我的控制器中填充它。在我看来,我要声明:

代码语言:javascript
复制
@model WebApplication1.Models.UsersAndRolesModel

最后是我的网格:

代码语言:javascript
复制
@Html.Grid(Model.Users).Columns(columns => { // and so on...

@Html.Grid(Model.Roles).Columns(columns => { // and so on...

我希望这能帮到你。

编辑:嗨,大卫,这取决于你实际想要做什么:你想要一个视图显示两个表,一个用于所有用户,一个用于所有角色?在这种情况下,第一个实现可以(但不应该)是:

代码语言:javascript
复制
    public ActionResult Details()
    {
        UsersAndRolesModel model = new UsersAndRolesModel();
        DataClassesUserDataContext db = new DataClassesUserDataContext();
        model.Users = db.AspNetUsers.ToList();
        model.Roles = db.AspNetUserRoles.ToList();
        return View(model);
    }

我写的不应该是因为DataClassesUserDataContext必须在使用后被释放。所以你真正应该做的是:

代码语言:javascript
复制
public class HomeController : Controller
{
    private DataClassesUserDataContext db = new DataClassesUserDataContext();

    public ActionResult Details()
    {
        UsersAndRolesModel model = new UsersAndRolesModel();
        model.Users = db.AspNetUsers.ToList();
        model.Roles = db.AspNetUserRoles.ToList();
        return View(model);
    }

    protected override void Dispose(bool disposing)
    {
        if (disposing)
        {
            db.Dispose();
        }
        base.Dispose(disposing);
    }

}
票数 0
EN

Stack Overflow用户

发布于 2016-04-01 21:32:27

我已经编辑了我以前的答案,并提供了一些有关如何实现控制器的信息。发生NullReferenceException是因为返回

代码语言:javascript
复制
return View();

向视图提供空模型,因此Model.Users和Model.Roles会导致视图中的NullReferenceException。请注意我要回来了

代码语言:javascript
复制
return View(model);

在我的HomeController里。

让我补充一下,我避免在控制器中使用DbContexts。我更喜欢实现存储库模式。您可以在这里找到一个很好的例子:http://www.asp.net/mvc/overview/older-versions/getting-started-with-ef-5-using-mvc-4/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application --这是一种更好的方法,因为它允许您创建一个测试项目,并通过提供模拟存储库实现来测试控制器。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36354752

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档