2

所以我正在做的事情可能看起来很简单,但我不知道该怎么做。

我已经注册并登录了一个帐户(我使用的是 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

4 回答 4

0

登录后可以将认证用户的UserId保存在Session中:

Session["UserId"] = userId;

或者由于您使用的是 FormsAuthentication,您可以使用此处所示的 UserData 属性,或者执行一个不错的技巧:

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是具有我上面给出的代码的类的实例。

于 2013-04-03T00:47:46.490 回答
0

这应该有效。

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

于 2013-04-03T01:55:18.343 回答
0

假设您Create还有一个GET已加载并用作模型的Create.cshtml,您只需要在其中显式设置它ActionResult

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

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

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

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

于 2013-04-03T02:09:38.990 回答
0

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

Membership.GetUser().ProviderUserKey
于 2013-04-03T09:57:46.277 回答