如何获取用户对象并使用模型保存?

时间:2012-08-31 02:26:01

标签: asp.net-mvc entity-framework asp.net-mvc-4

我创造了我非常简单的模型:

public class ImageModel
{
    public int Id { get; set; }
    public string FileName { get; set; }
}

现在我想用登录用户存储记录。据推测,我会通过添加另一个属性来做到这一点:

public User User { get; set; }

Visual Studio告诉我的是告诉我在

using System.Web.Providers.Entities;

假设这是与当前经过身份验证的用户对应的正确User类,如何使用我的模型保存该类?

我的Create操作如下所示:

    [HttpPost]
    public ActionResult Create(ImageModel imagemodel)
    {
        if (ModelState.IsValid)
        {
            db.ImageModels.Add(imagemodel);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        return View(imagemodel);
    }

我想我想添加像

这样的东西
 imagemodel.User = User;

db.ImageModels.Add之上,但这些似乎是两种不同的类型。 User中的Controller对象似乎是IPrincipal,它实际上似乎根本没有太多信息。

如何获取经过身份验证的用户的其余用户数据?我需要将imagemodel.User分配给哪些人?甚至是这样做的方式,或者我是否需要明确地告诉它我只想保存用户ID(我假设它可以解决这个问题) - 如果是这样,我该如何保持{{ 1}}我的模型上的对象,它指向真正的用户对象(不仅仅是一个ID),如何获取当前登录用户的用户ID?

1 个答案:

答案 0 :(得分:2)

这取决于您使用何种技术来管理登录或会话。

在控制器方法中,您可能只想将model属性设置为'User.Identity.Name'中的值,这是一个字符串值。

假设用户已登录并且您已配置表单身份验证。您之前可能已对用户进行了身份验证,并通过FormsAuthentication.SetAuthCookie方法为其提供了包含“.Name”值的令牌(基本上只是一个加密的cookie)。

因此,为了使事情变得非常简单,您的Image模型应该只具有Username字符串属性。如果您有权访问用户身份表,则可能需要存储对相关用户的引用。

public class ImageModel
{
    public int Id { get; set; }
    public string FileName { get; set; }
    public string Username { get; set; }
}

...控制器

[HttpPost]
public ActionResult Create(ImageModel imagemodel)
{
    if (ModelState.IsValid && User.Identity.IsAuthenticated)
    {
        imagemodel.Username = User.Identity.Name;
        db.ImageModels.Add(imagemodel);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

在不知道您使用的提供程序的情况下暴露的接口非常少。

IPrinicipal User
    bool IsInRole(string role)
    IIdentity Identity
        string AuthenticationType
        bool IsAuthenticated
        string Name

就是这样。

一旦您选择了提供商或决定实施custom one,就会有一系列SO文章落入您的行列。

在研究此主题时,您可能还会更好地寻找ASP.NET引用而不是MVC引用。