在Asp.Net MVC应用程序中保留数据

时间:2014-10-13 08:24:15

标签: c# asp.net-mvc

我的应用程序允许我们的销售团队管理不同客户的配置(例如:电子邮件模板,网站资源,CSS ...)。应用程序的每个页面都需要客户端ID,以指示正在修改哪个客户端。布局中有一个下拉列表,因此您可以在客户端之间切换。

到目前为止,我正在每个页面上传递id,并将其作为链接中的查询字符串传递

@Url.Action("Action", "Controller", new { clientId = Model.ClientId })

在包含客户端ID的每个表单中都有一个隐藏字段。

我不想使用会话,但随着应用程序的增长,在每个链接中传递客户端ID变得有点麻烦,并且在每种形式中都有隐藏字段。

您怎么看?

3 个答案:

答案 0 :(得分:0)

在ASP.NET MVC 中,有三种方法 - ViewData, ViewBag and TempData将数据从控制器传递到视图和下一个请求。与WebForm一样,您也可以使用Session在用户会话期间保留数据。他们每个人都有自己的重要性。

  • TempData的
  • 的ViewData
  • ViewBag

Visual representation of three ways


如何使用

public ActionResult Index()
{
    ViewBag.Name = "Monjurul Habib";
    return View();
}

public ActionResult Index()
{
    ViewData["Name"] = "Monjurul Habib";
    return View();
} 

在视图中:

@ViewBag.Name 
@ViewData["Name"] 

答案 1 :(得分:0)

我建议使用声明而不是传递客户端ID。例如,只要您的客户端登录,您就将客户端的ID设置为声明(实际存储在Cookie中)。之后,通过Controller的Action Method,您可以检查Claim。以下是检查声明的示例:

public static bool HasClaim(string claimType, string claimValue)
{
    ClaimsIdentity claimsIdentity = HttpContext.Current.User.Identity as ClaimsIdentity;
    return claimsIdentity != null && claimsIdentity.HasClaim(claimType, claimValue);
}

我认为这种方式更容易,更易于维护,更清晰。我已回答了有关基于声明的访问控制的问题,您也可以在此处查看:

Role-based access control (RBAC) vs. Claims-based access control (CBAC) in ASP.NET MVC

您可以将ClaimsAuthorizeAttribute创建为

 public class ClaimsAuthorizeAttribute : AuthorizeAttribute
    {
        private readonly string _claimType;
        private readonly string _claimValue;


        public ClaimsAuthorizeAttribute(string claimType, string claimValue)
        {
            this._claimType = claimType;
            this._claimValue = claimValue;
        }

        private static bool IsLoggedIn
        {
            get {
                return HttpContext.Current != null && HttpContext.Current.User != null && HttpContext.Current.User.Identity.IsAuthenticated;
            }
        }

        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            if (httpContext == null)
                throw new ArgumentNullException("httpContext");

            if (!IsLoggedIn)
                return false;

            return HasClaim(_claimType, _claimValue);
        }
     }

在Action方法中,按如下方式使用它:

  [ClaimsAuthorize(ClaimTypes.Role, "Your Client Id")]
    public ActionResult Index()
    {

        return View();
    }

答案 2 :(得分:0)

将数据存储在会话中或设置自定义Cookie。

基于会话的解决方案的自定义cookie解决方案的一个论点是,当ASP.NET必须查找会话并反序列化/序列化数据时,会涉及一些开销。