如何在ASP.NET MVC 4中将LogI用户的UserId添加到发布的数据中

时间:2013-04-03 00:18:08

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

所以我正在做的事情似乎很简单,但我不知道该怎么做。

我已经注册并使用帐户登录(我使用的是ASP.NET MVC 4中使用的默认会员系统),因此我想将我的UserId添加到我正在插入数据库的某些数据中。

这是我正在插入的数据模型:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace Reroute.Models
{
    public class Request
    {
        public int      RequestId { get; set; }
        // I want to add UserId based on my current session
        public int      UserId { get; set; }
        public string   OrderNumber { get; set; }
        public string   TrackingNumber { get; set; }
        public string   CurrentAddress { get; set; }
        public string   NewAddress { get; set; }
        public string   Comment { get; set; }
    }
}

ActionResult(这里我认为我必须进行更改):

[HttpPost]
public ActionResult Create(Request collection)
{
    try
    {
        _db.Requests.Add(collection);
        _db.SaveChanges();
        //return RedirectToAction("Index");
        return Content("Done! Added to DB");
     }
     catch
     {
        return View();
     }
 }

由于

4 个答案:

答案 0 :(得分:0)

登录后,您可以在Session中保存经过身份验证的用户的UserId:

Session["UserId"] = userId;

或者由于您使用的是FormsAuthentication,您可以将UserData属性用作shown here,也可以做一个不错的做法:

public SignInUser(string name, string id) {
    // store the userid
    FormsAuthentication.SetAuthCookie(name + '|' + id, false);
}

然后像这样检索Name和UserId:

public int CurrentUserId
{
    get
    {
        var context = HttpContext.Current;
        if (context == null) return 0;

        return context.Request.IsAuthenticated
                    ? Convert.ToInt32(context.User.Identity.Name.Split('|')[1])
                    : 0;
    }
}

public string CurrentUserName
{
    get
    {
        var context = HttpContext.Current;
        if (context == null) return string.Empty;

        return context.Request.IsAuthenticated 
            ? context.User.Identity.Name.Split('|')[0] 
            : string.Empty;
    }
}

你可以在一个类中拥有这些方法和属性,这样你就可以在一个地方拥有它们,我实际上是这样做的。现在,您可以在控制器中调用它,如下所示:

[HttpPost]
public ActionResult Create(Request collection)
{
    try
    {
        collection.UserId = _authProvider.CurrentUserId;
        // if you want to use session, I prefer the FormsAuthentication approach
        // you need to do additional check that the Session has not expired (not null)
        collection.UserId = Session["UserId"];

        _db.Requests.Add(collection);
        _db.SaveChanges();
        //return RedirectToAction("Index");
        return Content("Done! Added to DB");
    }
    catch
    {
        return View();
    }
}

_authProvider是具有上面给出的代码的类的实例。

答案 1 :(得分:0)

这应该有用。

var loggedInUserName=Thread.CurrentPrincipal.Identity.Name;
var user=Membership.GetUser(loggedInUserName);
var key = user.ProviderUserKey;

Ť

答案 2 :(得分:0)

假设您的Create也有GET已加载并用作Create.cshtml的模型,您只需要在ActionResult <中明确设置它/ p>

public ActionResult Create() 
{
   Result model = new Result();
   model.UserId = myUserId;
}

然后在你的Create.cshtml中,你可以有一个隐藏的字段:

@Html.HiddenFor(m => m.UserId)

我仍然会检查POST以确保允许执行保存的用户保存并且没有将隐藏字段值欺骗给完全不同的人。

答案 3 :(得分:0)

使用它可以获得用户ID ...

Membership.GetUser().ProviderUserKey