C# 使用GET将当前用户作为参数传递给外部url

C# 使用GET将当前用户作为参数传递给外部url,c#,html,asp.net-mvc,get,asp.net-mvc-5,C#,Html,Asp.net Mvc,Get,Asp.net Mvc 5,我正在使用ASP.NET、MVC 5和Identity 2.0构建一个应用程序 当用户单击导航栏中的一个按钮时,我捕获当前用户及其安全戳,并使用GET将其作为参数传递给外部url。就这样, <ul class="nav navbar-nav"> @if (Request.IsAuthenticated && User != null) { <li class="menu-item">@Html.ActionLink("Externa

我正在使用ASP.NET、MVC 5和Identity 2.0构建一个应用程序

当用户单击导航栏中的一个按钮时,我捕获当前用户及其安全戳,并使用GET将其作为参数传递给外部url。就这样,

<ul class="nav navbar-nav">
   @if (Request.IsAuthenticated && User != null)
   {
      <li class="menu-item">@Html.ActionLink("External URL", "ExternalUrl", "Home")</li>
   }
...

public ActionResult ExternalUrl()
{
    var user = System.Web.HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(User.Identity.GetUserId());
    var userName = user.UserName;
    var par1 = user.SecurityStamp;

    return Redirect("http://externalurl/access.asp?" + "userName=" + userName + "&par1=" + par1);
}
    @if(Request.IsAuthenticated&&User!=null) {
  • @Html.ActionLink(“外部URL”、“外部URL”、“主页”)
  • } ... 公共操作结果外部URL() { var user=System.Web.HttpContext.Current.GetOwinContext().GetUserManager().FindById(user.Identity.GetUserId()); var userName=user.userName; var par1=user.SecurityStamp; 返回重定向(“http://externalurl/access.asp?“+”用户名=“+userName+”&par1=“+par1”); }

这确实有效,解决了我的问题,但看起来很难看。我是网络编程新手,我想一定有更好/更漂亮的方法。如何实现?

您可以实现自己的ActionFilterAttribute,以“注入”包含所需所有用户属性的对象

您的UserViewModel将是:

public class UserViewModel
{
    public string UserName {get; set;}
    public string SecurityStamp {get; set;}
}
过滤器实现:

public class LoggedUserParameterAttribute : ActionFilterAttribute
{
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            base.OnActionExecuting(filterContext);

            // Get the User (you have to adjust your code here)                
            var user = System.Web.HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(User.Identity.GetUserId());

            // 'Assemble' your logged user with all the needed information
            var userViewModel = UserViewModel {
                UserName = user.UserName,
                SecurityStamp = user.SecurityStamp
            }

            // Create an optional action parameter 'loggedUser'
            filterContext.ActionParameters["loggedUser"] = userViewModel;
        }
}

好吧,你可以在声明标识中保留用户名和SecurityStamp,这样你就不必一直访问数据库。。。但这似乎是一个基于观点的问题。我不认为这是丑陋的地狱
[LoggedUserParameter]
public ActionResult ExternalUrl(UserViewModel loggedUser)
{
        return Redirect("http://externalurl/access.asp?" + "userName=" + loggedUser.UserName + "&par1=" + loggedUser.SecurityStamp);
}