4

私は MVC3 開発の学習を開始しましたが、ちょっとした障害にぶつかりました。私のプロジェクトでは、既定の aspnet_ メンバーシップ テーブルを別の SQL Server 2008 Express データベースに移動しました。次に、独自のテーブルを追加して、追加のプロファイル データを保持しました。ユーザー名 (aspnet_Users から)、電子メール アドレス (aspnet_Membership から)、名と姓 (ユーザー ID を PK としてカスタム作成されたテーブル UserDetails から aspnet_Users への FK)、およびユーザーの役割 ( aspnet_UsersInRoles および aspnet_Roles)。

これまでのところ、データベースから読み書きするために、dbcontext クラスを使用して、カスタム構築されたテーブルごとにモデルを構築しました。

    public class UserDetail
{

    [Key]
    public Guid UserId { get; set; }

    public string FirstName { get; set; }

    public string LastName { get; set; }

    public string Address { get; set; }

    public string City { get; set; }

    public string State { get; set; }

    public string Zip { get; set; }

    public string Phone { get; set; }

    public DateTime DateUpdated { get; set; }
}

public class UserLinkToken
{
    [Key]
    public Guid UserId { get; set; }

    public string LinkToken { get; set; }

    public DateTime DateUpdated { get; set; }
}

public class ProShotDB : DbContext
{
    public DbSet<UserDetail> UserDetails { get; set; }
    public DbSet<UserLinkToken> UserLinkTokens { get; set; }
}

モデルと dbcontext の名前がデータベースとテーブル名が一致せず、アプリが別のデータベースを作成することになる場合、アプリがデータベースを書き込んで更新するために、テーブルに「UserDetails」と「UserLinkTokens」という名前を付ける必要がありました。テーブルにデータを書き込みます。

aspnet_ テーブルのプロパティとカスタム テーブルのプロパティを使用してビューにオブジェクトを送信するように指示できることから、ModelView を作成する必要があります。多くのモデルビューの例を読んだ後でも、自分のアプリがどのように見えるべきかまだ明確ではありません。

データ行のリストを表示し、ユーザー ID を指定してモデルビューで参照されているそれぞれのテーブル列をすべて更新するために使用できるモデルビューの例を教えてください。

例として、すべての FirstNames (UserDetails テーブル) とそれに対応する Email (aspnet_Membership) のビューが必要だとします。

私の最終的な目標は、ユーザーに割り当てられた役割を表示するビューです。一覧表示された各ユーザーには、現在管理者ロールに属していない場合は管理者として割り当てるか、現在管理者である場合は管理者ロールを削除するコントローラーにつながるリンクがあります。

この種の質問が他の質問で以前に回答されていた場合は申し訳ありません。私はそれらのかなりの数を読みましたが、おそらく私の質問に答えるべきだったように感じますが、まったく一致するものはありませんでした. ほとんどの場合、私の混乱は、アプリがデータベースにどのように接続されているかを完全に理解していないことが原因です。私のモデルはテーブルのデータ行を表し、dbcontext はこれらのデータ行モデルのセットを取り、それをデータベース内のテーブルに接続することをある程度理解しています (dbset<(datarow/model object)> (table of datarows /モデル オブジェクトのセット))。aspnet_ テーブル/モデル オブジェクトの dbcontext クラスが表示されないため、これらのテーブルのデータがどのように取得、更新、または書き込まれるかについての適切な概念がありません。

これがどのように機能するかについての私の無知を片付けたり、必要なことを達成する方法の簡単な例を教えてくれてありがとう.

4

2 に答える 2

1

まず、ModelView ではなくビュー モデルと呼ばれます。ビュー モデルは、ビュー用にカスタマイズされた単なるクラスです。通常、そのビューに必要なデータのみが含まれ、検証とプレゼンテーションを処理するためのデータ注釈などが含まれます。

したがって、ビューに表示するすべてのデータを含むモデルを作成するだけです。ビューモデルの作成はこれですべてです。

したがって、ビューモデルは単純になります

public class MyViewModel {
    public string FirstName {get;set;}
    public string Email {get;set;}        
}

次に、あなたの見解では、次のようなことをするだけです:

@model MyViewModel

@using(Html.BeginForm()) {
    @Html.EditorForModel()
    <input type="submit" />
}

コントローラー (またはビジネス レイヤー) では、単純にクエリを実行してユーザー名と電子メールを取得し、クエリ結果から値をビュー モデルにコピーします。

データを更新するときは、逆の操作を行います。これは非常に大きな概念ですが、このような投稿で議論するには. MVC Music Store や Nerd Dinner などのサンプル コードを実際に確認する必要があります。

心に留めておくべき重要なこと。メンバーシップは、他のテーブルとは完全に別のシステムです。それらを個別に取得し、個別に更新する必要があります。メンバーシップ API を使用してメンバーの電子メールやその他の詳細を更新し、独自のテーブルを使用してデータを更新します。

于 2012-10-22T02:22:25.860 に答える
0

この機能に本当に必要なのはメンバーシップだけだと判断したので、名前と姓を含めることをやめました。

私のビューモデル:

namespace Pro_Shot_Portal.ViewModels
{
    public class SetAdminViewModel
    {
        public string UserName { get; set; }
        public string Email { get; set; }
        public string[] Role { get; set; }
    }
}

私のコントローラー:

    [Authorize(Roles = "Administrator")]
    public ActionResult SetRoles()
    {

        var model = Membership
            .GetAllUsers()
            .Cast<MembershipUser>()
            .Select(x => new SetAdminViewModel
                {
                    UserName = x.UserName,
                    Email = x.Email,
                    Role = Roles.GetRolesForUser(x.UserName)
                });
        return View(model);
    }

    [Authorize(Roles = "Administrator")]
    public ActionResult AddAdmin(string username)
    {
        Roles.AddUserToRole(username, "Administrator");

        return RedirectToAction("SetRoles", "Account");
    }

    [Authorize(Roles = "Administrator")]
    public ActionResult RemoveAdmin(string username)
    {
        Roles.RemoveUserFromRole(username, "Administrator");

        return RedirectToAction("SetRoles", "Account");
    }

私の見解:

@model IEnumerable<Pro_Shot_Portal.ViewModels.SetAdminViewModel>

@{
    ViewBag.Title = "Set Roles";
}

<h2>Index</h2>

<table>
    <tr>
    <td>UserName</td>
    <td>Email</td>
    <td>Roles</td>
    </tr>

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.UserName)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Email)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Role)
        </td>

        <td>
            @if (@Html.DisplayFor(modelItem => item.Role).ToString() == "Administrator")
            {
                @Html.ActionLink("Remove Admin", "RemoveAdmin", new { username = item.UserName })
            }
            else
            {
                @Html.ActionLink("Add Admin", "AddAdmin", new { username = item.UserName })
            }
        </td>
    </tr>
}

</table>

これは今のところ私にとってはうまくいくようです。

私を正しい道に導く手助けをしてくれてありがとう Mystere. また、コードに問題がある場合はお知らせください。

于 2012-10-23T01:41:02.247 に答える