簡體   English   中英

MVC3默認會員屬性在視圖中具有自定義模型屬性(使用ModelView?)

[英]MVC3 default membership properties with custom model properties in view (use ModelView?)

我已經開始學習MVC3開發並且遇到了一些絆腳石。 在我的項目中,我已將默認的aspnet_ membership表移動到單獨的SQL Server 2008 Express數據庫中。 然后我添加了自己的表來保存額外的配置文件數據。 我現在想要構建一個視圖,列出用戶名(來自aspnet_Users),電子郵件地址(來自aspnet_Membership),名字和姓氏(來自自定義構建表UserDetails,用戶ID為PK和FK到aspnet_Users)和用戶角色( 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; }
}

我必須為我的應用程序命名我的表“UserDetails”和“UserLinkTokens”來編寫和更新我的數據庫,當模型和dbcontext的名稱與我的數據庫和表名不匹配時,應用程序將最終創建另一個數據庫表並在那里寫入數據。

從我可以告訴發送一個對象來查看aspnet_表的屬性和我的自定義表中的屬性,我將要構建一個ModelView。 在閱讀了很多模型視圖示例之后,我仍然不清楚應該如何查找我的應用程序。

有人可以給我一個模型視圖的例子,我可以用它來顯示數據行列表並更新給定用戶ID的模型視圖中引用的所有相應表列嗎?

舉個例子,我想要一個所有FirstNames(UserDetails表)及其相應的電子郵件(aspnet_Membership)的視圖。

我的最終目標是顯示用戶指定角色的視圖。 列出的每個用戶都有一個鏈接,該鏈接將指向一個控制器,如果他們當前不具有該角色,則將其分配為管理員,如果他們當前是管理員,則刪除管理員角色。

很抱歉,如果此類問題之前已在其他問題中得到解答。 我已經閱讀了其中的一些,覺得他們可能應該回答我的問題,但似乎沒有一個匹配。 很可能我的困惑源於不完全理解我的應用程序如何連接到我的數據庫。 我理解我的模型表示一個表的一行數據,dbcontext接受一組這些數據行模型並將其連接到數據庫中的表(dbset <(datarow / model object)>(datarows /表)一組模型對象))。 由於我沒有看到aspnet_ tables / model對象的dbcontext類,因此我沒有很好地了解這些表中的數據如何被檢索,更新或寫入。

感謝任何幫助,清除我對它的工作原理的無知,或者給我一個如何完成我需要的簡單例子。

首先,它被稱為視圖模型,而不是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。

重要的是要記住。 成員資格是與其他表格完全獨立的系統。 您必須單獨檢索它們,並單獨更新它們。 使用Membership API更新成員電子郵件或其他詳細信息,並使用您自己的表來更新數據。

好吧,我決定我真正需要的所有功能都在會員中,所以我放棄了嘗試包括名字和姓氏。

我的ViewModel:

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。 如果我的代碼出現任何問題,請告訴我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM