MVC5 MVCGRID Linq乘法表
我正在使用ASPNET MVC5,我只是遵循了本教程:它工作得很好。 我现在想用2个表(用户和角色)更新我的HomeController, 注意:My Datacontext包含2个表(用户和角色) HomeController.csMVC5 MVCGRID Linq乘法表,linq,join,asp.net-mvc-5,datacontext,mvcgrid,Linq,Join,Asp.net Mvc 5,Datacontext,Mvcgrid,我正在使用ASPNET MVC5,我只是遵循了本教程:它工作得很好。 我现在想用2个表(用户和角色)更新我的HomeController, 注意:My Datacontext包含2个表(用户和角色) HomeController.cs public ActionResult Details() { DataClassesUserDataContext db = new DataClassesUserDataContext(); v
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);
}
我的成绩很好
我现在认为:
我的详细信息.cshtml
这里有问题吗?我可以调用shanumvcuseroles.DB.AspNetUser和AspNetUserRoles吗?
@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>
@model IEnumerable
//可以在这里添加其他型号吗@模型IEnumerable
>class=“代码剪切”>
>@Html.Grid(Model).Columns(Columns=>{
>columns.Add(c=>c.UserName).标题为(“UserName”).Filterable(true);
>columns.Add(c=>c.Id).标题为(“Id”).Filterable(true);
>columns.Add(c=>c.PasswordHash).Titled(“PasswordHash”).Filterable(true);
>列。添加(c=>c.Email)。标题为(“Email”)。可过滤(true);
>columns.Add(c=>c.AccessFailedCount)。标题为(“AccessFailedCount”)。可过滤(true);
>columns.Add(c=>c.PhoneNumber).标题为(“PhoneNumber”).Filterable(true);
>columns.Add()
>.编码(假)
>.消毒(假)
>.SetWidth(30)
>.RenderValueAs(o=>Html.ActionLink(“编辑”、“编辑”,新的{id=o.id}));})
我有以下错误:
传入字典的模型项的类型为“System.Data.Linq.DataQuery
1[f_uAnonymousType4
2[ShanumvCustomerRoles.DB.AspNetUser,ShanumvCustomerRoles.DB.AspNetUserRole]]”,但此字典需要类型为“System.Collections.Generic.IEnumerable`1[ShanumvCustomerRoles.DB.AspNetUser]的模型项“。您可以通过将AspNetUserRoles集合放入ViewBag来解决此问题。此链接显示了此解决方案以及其他解决方案:
P>个人认为,模型是我的控制器和我的视图之间的一种契约,所以我不喜欢把业务信息放在模型之外。例如,可以存储一个字符串以将日期时间格式化到ViewBag中。但是,如果我想要一个控制器和一个视图来管理用户和角色,我想让我和其他阅读代码的人都清楚,这可能在今天、明天或十年后发生
因此,在本例中,我将创建一个模型类:
namespace WebApplication1.Models
{
public class UsersAndRolesModel
{
public IList<shanuMVCUserRoles.DB.AspNetUser> Users { get; set; }
public IList<shanuMVCUserRoles.DB.AspNetRole> Roles { get; set; }
}
}
最后,我的网格:
@Html.Grid(Model.Users).Columns(columns => { // and so on...
@Html.Grid(Model.Roles).Columns(columns => { // and so on...
我希望这有帮助
编辑:
您好,David,这取决于您实际想要做什么:您是否希望视图显示两个表,一个用于所有用户,一个用于所有角色?
在这种情况下,第一个实现可以(但不应该)是:
我写的不应该是,因为DataClassesUserDataContext必须在使用后处理。所以你真正应该做的是:
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);
}
}
我已经编辑了我先前的答案,其中包含了一些关于如何实现控制器的信息。 发生NullReferenceException是因为返回
return View();
return View(model);
为视图提供空模型,因此model.Users和model.Roles会导致视图中出现NullReferenceException。
请注意,我回来了
return View();
return View(model);
在我的家庭控制器里
让我补充一点,我避免在控制器中使用DBContext。
我更喜欢实现存储库模式。
你可以在这里找到一个很好的例子:
这是一种更好的方法,因为它允许您通过提供模拟存储库实现来创建测试项目和测试控制器