2015-06-09 46 views
1

强类型会话对象根据各种来源网上,我应该用这个MVC引用我的观点

public static class SessionExtensions 
    { 
     /// <summary> 
     /// Get value. 
     /// </summary> 
     /// <typeparam name="T"></typeparam> 
     /// <param name="session"></param> 
     /// <param name="key"></param> 
     /// <returns></returns> 
     public static T GetDataFromSession<T>(this HttpSessionStateBase session, string key) 
     { 
      return (T)session[key]; 
     } 

     /// <summary> 
     /// Set value. 
     /// </summary> 
     /// <param name="session"></param> 
     /// <param name="key"></param> 
     /// <param name="value"></param> 
     public static void SetDataToSession(this HttpSessionStateBase session, string key, object value) 
     { 
      session[key] = value; 
     } 
    } 

要使用会话对象的MVC。 我已经做了以下BaseController

public class BaseController : Controller 
    { 
     public int UserID 
     { 
      get { return Session.GetDataFromSession<int>("UserID"); } 
      set { Session.SetDataToSession("UserID", value); } 
     } 
} 

我现在继承BaseController

public class RequestsController : BaseController 
    { 
     private FooModel db = new FooModel(); 

     // GET: Requests 
     public ActionResult Index() 
     { 
      var viewModel = Mapper.RequestIndex(UserID); 
      return View(viewModel); 
     } 
} 

,我可以使用用户名会话对象没有问题。

如何在我的视图中使用相同的会话对象,而无需将其添加到模型中。

<div class="clearfix"> 
       @if (Session["UserID"].ToString() == "1") 
       { 
     <div class="btn btn-default pull-right "> 
      @Html.ActionLink("Super Special link for User 1", "sslfu1") 
     </div> 
       } 
    </div> 

Session["UserID"]在这里不正确。我应该使用什么?

+0

“不正确”是什么意思?你是否交叉检查Session是否被设置? – ramiramilu

回答

0

我已经修改了我的SessionExtensions类包括以下内容:

public static T GetDataFromSession<T>(this HttpSessionStateBase session, string key) 
     { 
      return (T)session[key]; 
     } 

然后在视图中引用它像这样:@Session.GetDataFromSession("UserID")

这是不是强类型的,但是这更符合自然

1

你有多种方法可以做到这一点,一个简单的方法就是利用ViewBag

public ActionResult Index() 
{ 
    var viewModel = Mapper.RequestIndex(UserID); 
    ViewBag.UserID = UserID; 
    return View(viewModel); 
} 

在视图中,您可以像这样使用它。

<div class="clearfix"> 
    @if (ViewBag.UserID == 1) 
    { 
     <div class="btn btn-default pull-right "> 
      @Html.ActionLink("Super Special link for User 1", "sslfu1") 
     </div> 
    } 
</div> 
+0

这种方法的缺点是我需要将它添加到视图包中,我想避免这种情况。 –

+0

@Stingervz你可以使用我的第二种方法,我使用扩展方法从'Session'中获取'UserID'。让我更新。 – adricadar

1

我要使它强类型,你可以使用扩展方法来像为获得UserID的包装。

public static int UserID(this HttpSessionStateBase session) 
{ 
    return session.GetDataFromSession<int>("UserID"); 
} 

在查看

<div class="clearfix"> 
    @if (Session.UserID() == 1) 
    { 
     <div class="btn btn-default pull-right "> 
      @Html.ActionLink("Super Special link for User 1", "sslfu1") 
     </div> 
    } 
</div>