MVC3默认会员属性在视图中具有自定义模型属性(使用ModelView?)

时间:2012-10-22 00:30:20

标签: c# asp.net asp.net-mvc-3 razor

我已经开始学习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。在阅读了很多模型视图示例之后,我仍然不清楚应该如何查找我的应用程序。

有人可以给我一个模型视图示例,我可以用它来显示数据行列表,并在给定用户标识的情况下更新模型视图中引用的所有相应表格列吗?

对于示例,我想说我只想要查看所有FirstNames(UserDetails表)及其相应的电子邮件(aspnet_Membership)。

我的最终目标是显示具有指定角色的用户的视图。列出的每个用户都有一个链接,该链接将指向一个控制器,如果他们当前不具有该角色,则将其分配为管理员,如果他们当前是管理员,则删除管理员角色。

很抱歉,如果此类问题之前已在其他问题中得到解答。我已经阅读了其中的一些,觉得他们可能应该回答我的问题,但似乎没有一个匹配。很可能我的困惑源于不完全理解我的应用程序如何连接到我的数据库。我理解我的模型表示一个表的一行数据,dbcontext接受一组这些数据行模型并将其连接到数据库中的表(dbset&lt;(datarow / model object)&gt;(数据行表) /一组模型对象))。由于我没有看到aspnet_ tables / model对象的dbcontext类,因此我没有很好地了解这些表中的数据如何被检索,更新或写入。

感谢任何帮助,清除了我对这是如何工作的无知,或者给我一个如何完成我需要的简单例子。

2 个答案:

答案 0 :(得分: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。

要记住重要的事情。成员资格是与其他表格完全独立的系统。您必须单独检索它们,并单独更新它们。使用Membership API更新成员电子邮件或其他详细信息,并使用您自己的表来更新数据。

答案 1 :(得分:0)

我确定我真正需要的所有功能都在会员资格中所以我放弃了尝试包括名字和姓氏。

我的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。如果我的代码出现任何问题,请告诉我。