0

我有 3 张桌子和 3 个模型。将控件添加到控制文件夹。选择 pages_UsersInRoles 和 UserContext 作为上下文。我需要显示 UserId (Int) UserName (String) 和 UserRoles (String)。无论如何都无法获取用户名?

//my user context and models
enter code here
public class UsersContext : DbContext
{
    public UsersContext()
        : base("DefaultConnection")
    {
    }

    public DbSet<UserProfile> UserProfiles { get; set; }
    public DbSet<webpages_Roles> RolesList { get; set; }
    public DbSet<webpages_UsersInRoles> UsersInRole { get; set; }

}



[Table("UserProfile")]
public class UserProfile
{
    [Key]
    public int UserId { get; set; }
    [Required(ErrorMessage = "Department name is required.")]
    [MaxLength(50)]
    public string UserName { get; set; }

}

[Table("webpages_Roles")]
public class webpages_Roles
{
    [Key]
    public int RoleId { get; set; }
    public string RoleName { get; set; }

    public virtual ICollection<webpages_UsersInRoles> Roles { get; set; }

}

[Table("webpages_UsersInRoles")]
public class webpages_UsersInRoles
{
    [Key]
    [Column(Order = 0)]
    public int UserId { get; set; }
   // [Key]
    [Column(Order = 1)]
    public int RoleId { get; set; }


    public virtual ICollection<webpages_Roles> Roles { get; set; }
   // public virtual ICollection<UserProfile> User { get; set; }

}
///end my controller for index

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace DizelgeMVC.Models
{
public class Default1Controller : Controller
{
    private UsersContext db = new UsersContext();

    //
    // GET: /Default1/

    public ActionResult Index()
    {
        return View(db.UsersInRole.ToList());
    }

    //
    // GET: /Default1/Details/5

    public ActionResult Details(int id = 0)
    {
        webpages_UsersInRoles webpages_usersinroles = db.UsersInRole.Find(id);
        if (webpages_usersinroles == null)
        {
            return HttpNotFound();
        }
        return View(webpages_usersinroles);
    }

    //
    // GET: /Default1/Create

    public ActionResult Create()
    {
        return View();
    }

    //
    // POST: /Default1/Create

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(webpages_UsersInRoles webpages_usersinroles)
    {
        if (ModelState.IsValid)
        {
            db.UsersInRole.Add(webpages_usersinroles);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        return View(webpages_usersinroles);
    }

    //
    // GET: /Default1/Edit/5

    public ActionResult Edit(int id = 0)
    {
        webpages_UsersInRoles webpages_usersinroles = db.UsersInRole.Find(id);
        if (webpages_usersinroles == null)
        {
            return HttpNotFound();
        }
        return View(webpages_usersinroles);
    }

    //
    // POST: /Default1/Edit/5

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Edit(webpages_UsersInRoles webpages_usersinroles)
    {
        if (ModelState.IsValid)
        {
            db.Entry(webpages_usersinroles).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(webpages_usersinroles);
    }

    //
    // GET: /Default1/Delete/5

    public ActionResult Delete(int id = 0)
    {
        webpages_UsersInRoles webpages_usersinroles = db.UsersInRole.Find(id);
        if (webpages_usersinroles == null)
        {
            return HttpNotFound();
        }
        return View(webpages_usersinroles);
    }

    //
    // POST: /Default1/Delete/5

    [HttpPost, ActionName("Delete")]
    [ValidateAntiForgeryToken]
    public ActionResult DeleteConfirmed(int id)
    {
        webpages_UsersInRoles webpages_usersinroles = db.UsersInRole.Find(id);
        db.UsersInRole.Remove(webpages_usersinroles);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

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

My View

@model IEnumerable<DizelgeMVC.Models.webpages_UsersInRoles>
@{

var db = new 
}

}
@{
ViewBag.Title = "Index";
}

<h2>Index</h2>

<p>
@Html.ActionLink("Create New", "Create")
</p>
<table>
<tr>
    <th>
        @Html.DisplayNameFor(model => model.RoleId)
    </th>
    <th></th>
</tr>

@foreach (var item in Model) {
<tr>
    <td>
        @Html.DisplayFor(modelItem => item.RoleId)
    </td>
    <td>
        @Html.ActionLink("Edit", "Edit", new { id=item.UserId }) |
        @Html.ActionLink("Details", "Details", new { id=item.UserId }) |
        @Html.ActionLink("Delete", "Delete", new { id=item.UserId })
    </td>
</tr>
}

</table>
4

2 回答 2

0

谢谢你的回复!

根据您的建议

将一个属性添加到您现有的 pages_UsersInRoles 模型中,该模型会获取您需要的值。为简单起见,第二个选项可能应该是您的第一次尝试。在任何给定的 pages_UsersInRoles 对象的上下文中,您都有一个 UserId,因此您可以使用它来获取有关该用户的更多信息。

像这样的简单属性可能会解决问题:

   //Added this codes to my webpages_UserInRoles
   public User User
    {
        get
        {
            return new UsersContext().UserProfiles.Single(u => u.UserId == this.UserId);
        }
    }

得到这个:

'DizelgeMVC.Models.webpages_UsersInRoles.User' is a 'property'
 but is used like a 'type'  

当我输入一个public class User比你的建议更有效的类时,添加页面顶部using System.Linq;但在这个类不知道之后UserId

于 2013-07-25T19:39:29.290 回答
0

请注意您传递给视图的模型:

@model IEnumerable<DizelgeMVC.Models.webpages_UsersInRoles>

这只是一个webpages_UsersInRoles对象列表,每个对象只有以下属性:

public int UserId { get; set; }
public int RoleId { get; set; }
public virtual ICollection<webpages_Roles> Roles { get; set; }

但在您看来,您需要的不仅仅是这些信息。具体来说,您还希望UserName在不同的模型上显示该属性。为此,您有几个选择。最直接的两个是:

  • 为包含您需要的所有属性的视图创建一个复合模型,并从控制器中的多个模型构建该复合模型。
  • 向现有webpages_UsersInRoles模型添加一个属性,以获取您需要的值。

为简单起见,第二个选项可能应该是您的第一次尝试。在任何给定webpages_UsersInRoles对象的上下文中,您都有一个UserId,因此您可以使用它来获取有关该用户的更多信息。像这样的简单属性可能会解决问题:

public User User
{
    get
    {
        return new UsersContext().UserProfiles.Single(u => u.UserId == this.UserId);
    }
}

或者,如果它要被多次访问,你可以在本地缓存该UserProfile对象,如下所示:

private User _user;
public User User
{
    get
    {
        if (_user == null)
            _user = new UsersContext().UserProfiles.Single(u => u.UserId == this.UserId);
        return _user;
    }
}

这将在您第一次需要访问该属性时延迟加载User,并将其保存在内存中以防您需要再次访问它。然后在您的模型上,您可以UserName通过这个新属性访问该属性:

@foreach (var item in Model)
{
    item.User.UserName
}

这里有几点需要注意:

  1. 从技术上讲,这不是一个很好的设计,因为它将模型与数据库上下文相结合。尽管它们已经耦合,因为您的模型是直接从您的数据库生成的。当您了解更多关于这里涉及的模式时,您会想要尝试将您的数据库与其他所有内容分离。但这完全是另一个问题,与问题没有直接关系。
  2. 关于 MVC 有一句谚语,“让你的模型很重,你的控制器很轻。” 这种方法将逻辑放在它所属的地方,放在模型而不是控制器上。模型(无论是从这样的数据库生成的还是自定义编写的)都应该在内部包含完成他们需要做的事情所需的所有逻辑和引用。
  3. 我注意到您试图在视图中实例化数据上下文。这是您不想继续尝试的方法。视图中不应有任何非 UI 逻辑。任何时候你必须在视图中声明一个变量(var基本上使用关键字),这表明有问题。模型应该包含视图所需的一切,并且视图应该只访问模型上的内容。如果有视图需要的新数据,请将其放在模型上。
于 2013-07-24T12:59:37.437 回答