我正在使用ASPNET MVC5,我刚刚学习了本教程:http://www.c-sharpcorner.com/UploadFile/4d9083/creating-simple-grid-in-mvc-using-grid-mvc/,它运行正常。 我现在想用2个表(用户和角色)更新我的HomeController, 注意:我的Datacontext包含2个表(用户和角色)
HomeController.cs
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);
}
我的结果很好
现在在我的观点中:
我的Details.cshtml 问题出在这里吗?我可以打电话给shanuMVCUserRoles.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>
我有以下错误:
传递到字典中的模型项的类型为'System.Data.Linq.DataQuery 1[<>f__AnonymousType4
2 [shanuMVCUserRoles.DB.AspNetUser,shanuMVCUserRoles.DB.AspNetUserRole]]',但此字典需要类型为'的模型项System.Collections.Generic.IEnumerable`1 [shanuMVCUserRoles.DB.AspNetUser]”。
答案 0 :(得分:0)
您可以通过将AspNetUserRoles集合放入ViewBag来解决此问题。此链接显示此解决方案: http://www.codeproject.com/Articles/687061/Multiple-Models-in-a-View-in-ASP-NET-MVC-MVC
就个人而言,我认为Model是我的Controller和View之间的一种契约,因此我不喜欢将业务信息放在Model之外。例如,可以存储字符串以将DateTimes格式化为ViewBag。但是如果我想要一个Controller和一个View来管理用户和角色,我希望它对我和其他任何阅读代码的人都很清楚,这可能发生在今天,明天或十年。
所以在这种情况下我会创建一个Model类:
namespace WebApplication1.Models
{
public class UsersAndRolesModel
{
public IList<shanuMVCUserRoles.DB.AspNetUser> Users { get; set; }
public IList<shanuMVCUserRoles.DB.AspNetRole> Roles { get; set; }
}
}
我会创建它并在我的Controller中填充它。 然后在我的视图中我会声明:
@model WebApplication1.Models.UsersAndRolesModel
最后我的网格:
@Html.Grid(Model.Users).Columns(columns => { // and so on...
@Html.Grid(Model.Roles).Columns(columns => { // and so on...
我希望这会有所帮助。
<强>修改强>: 嗨大卫,这取决于你真正想做的事情:你想要一个显示两个表的视图,一个用于所有用户,一个用于所有角色? 在这种情况下,第一个实现可以(但不应该):
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必须在使用后处理掉。所以你真正应该做的是:
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);
}
}
答案 1 :(得分:0)
我已经编辑了我之前的答案,其中包含有关如何实施Controller的一些信息。 发生NullReferenceException是因为返回
return View();
为View提供了一个null模型,因此Model.Users和Model.Roles会在View中导致NullReferenceException。 请注意我要回来了
return View(model);
在我的HomeController中。
让我补充一点,我避免在控制器中使用DbContexts。 我更喜欢实现Repository模式。 你可以在这里找到一个很好的例子: 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 这是一种更好的方法,因为它允许您创建一个Test项目并通过提供模拟存储库实现来测试您的控制器。