2013-07-25 46 views
0

我試着在ASP.NET MVC 4傳遞一個用戶名,他們已登錄,但我不能想出一個辦法來獲取數據轉移之後。Asp.net MVC 4 - 通過類傳遞數據

這裏被命名爲「驗證」登錄的行動,得到了一組後的用戶信息。

public string name; 
account userInfo; 

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Auth(account user) 
{ 
    if (ModelState.IsValid) 
    { 
     userInfo = GetUser(user); 
     if (userInfo.rank == "a") 
     { 
      Session["IsAdmin"] = true; 
      Session["IsMember"] = true; 
      name = userInfo.username; 
      return RedirectToAction("Index", "Mod"); 
     } 
     if (userInfo.rank == "member") 
     { 
      Session["IsMember"] = true; 
      name = userInfo.username; 
      return RedirectToAction("Index", "Post"); 
     } 
    } 

    name = userInfo.username; 
    return View("Login"); 
} 

名稱變量被設置後,我試圖從我的PostController中的索引視圖,它的值是使用繼承來顯示,但變量重置爲null我的網站的索引..繼承人用於索引操作從Auth Action所在的AccountController中調用name變量。

public class PostController : AccountController 
    { 
     public ActionResult Index(int? id) 
     { 

      /*EncryptConString();*/ 
      int pageNum = id ?? 0; 
      IEnumerable<Post> posts = 
       (from post in db.Posts 
       where post.time < DateTime.Now && post.category == "Blog Post" 
       orderby post.time descending 
       select post).Skip(pageNum * postCount).Take(postCount +1); 

      ViewBag.IsPreviousLinkVisible = pageNum > 0; 
      ViewBag.IsNextLinkVisible = posts.Count() > postCount; 
      ViewBag.PageNumber = pageNum; 
      Session["ShowSide"] = true; 
      ViewBag.showSidebar = showSidePanel; 
      ViewBag.SecAbvPosts = secAbvPosts; 
      ViewBag.IsAdmin = IsAdmin; 
      ViewBag.IsMember = IsMember; 
      ViewBag.Name = name; 
      return View(posts.Take(postCount)); 
     } 
    } 

有沒有另一種方法可以做到這一點?我試圖實現獲取用戶信息後,他們登錄顯示它與他們的個人資料圖片索引頁..請幫助!

+0

每個請求都由控制器的新實例處理。想想你如何使它成爲無狀態。緩存和會話可以在需要的地方使用。請記住,使用會話強制請求被連續處理而不是異步處理。 –

回答

1

的值不是重定向後可用,因爲你將有控制器類的全新實例作爲重定向的結果。沒有數據將在重定向之間持續。你有

一種選擇是使用TempData的作爲臨時存儲 - 只是足夠長的時間,從一個請求到下通過。它受到會話的支持,但壽命有限。 在這裏閱讀更多:Using Tempdata in ASP.NET MVC - Best practice

有一點要記住的是,雖然基於任何會話不會總是在負載平衡的系統,因爲你靠打每個請求在同一臺服務器正常工作。我通常會謹慎使用會話。在許多情況下,在第二個操作方法中重新加載數據庫中的用戶記錄可能會更容易。

+0

這將在2個不同的類之間工作嗎?不像Viewbag和ViewData? –

+0

它會在兩個不同的請求之間工作,所以是的。它基本上只是會話狀態,但一旦被第二個控制器操作讀取,它就從內存中移除。 – TGH

+0

這個怎麼樣 TempData [「Name」] = user.Name; name = TempData [「Name」]; 這在我的後控制器中設置ViewBag.Name = name; 應該這樣做然後擦除請求後的數據? –

1

A Controller只會持續網絡請求期間。一旦他們登錄..該控制器完成。下一個控制器會啓動一個全新的實例..當它發生時,name將會是null(如你所見)。

您的整個安裝過程非常奇怪,實際上違背了最佳實踐。我想說的是,你應該在新的請求中再次獲取用戶信息。鑑於目前的設置,如何確定用戶是另一個問題。你可能也將他們的用戶名存儲在Session ..但實際上,你應該使用.NET提供的Membership類,或者你至少應該使用可以通過HttpContext.Current.Identity屬性檢索的cookie對它們進行簽名。這樣,您可以通過名稱來識別它們並再次檢索它們的詳細信息。

另外值得注意的是:你混dynamic與強類型的模型類型(ViewBag)。選一個(強類型是首選/最佳實踐)。

+0

我明白你的意思了,TGH先指出了TempData的用法,但我很感謝你的幫助人!我也會看看Current.Identity –

0

我不認爲你可以實現這個使用繼承。儘管AccountController是一個父類型,但實例化的實際對象將隨着http請求行進路線而不同。 當您重定向到PostController時,PostController將是與AccountController完全不同的對象,而不是具有2種不同靜態類型的同一對象。

你可以另送TempData的名稱,並抓住它從那裏回來的重定向目標的行動。

0

這是在MVC中進行身份驗證的錯誤方法。您應該使用Windows身份驗證或FormsAuthentication或其他一些實現IIdentity和IPrincipal的機制。

您可以通過生成默認的互聯網模板應用程序並查看AccountController代碼並查找FormsAuthentication來查看如何工作的示例。然後您將使用[Authorize]屬性來控制訪問。

+0

我現在要這樣做 –