0

3 つのテーブルと 3 つのモデルがあります。コントロール フォルダにコントロールを追加します。コンテキストに webpages_UsersInRoles と UserContext を選択します。UserId (Int) UserName (String) と UserRoles (String) を表示する必要があります。とにかく UserName を取得できませんか?

//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

ビューに渡すモデルに注目してください。

@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、別のモデルのプロパティも表示する必要があります。これを行うには、いくつかのオプションがあります。最も直接的なものは次の 2 つです。

  • 必要なすべてのプロパティを含むビューの複合モデルを作成し、コントローラー内の複数のモデルからその複合モデルを構築します。
  • webpages_UsersInRoles必要な値を取得する既存のモデルにプロパティを追加します。

簡単にするために、おそらく 2 番目のオプションを最初に試す必要があります。特定の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 に答える