2010-02-02 41 views
2

我無法爲基本控制器獲取值。我想要做的是讓我的基礎控制器從ActionLink獲取一個ID?基本控制器獲取值

鏈接

<%= Html.ActionLink("About Us", "About", new { SectionId = 1 })%> 

基本控制器

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 

namespace Website.Controllers 
{ 
    public class SectionController : Controller 
    { 
     // 
     // GET: /Section/ 

     public SectionController(int SectionId) 
     { 
      if (SectionId == 1) 
      { 
       ViewData["Message"] = "GOT AN ID"; 
      } 
      else 
      { 
       ViewData["Message"] = "NO ID"; 
      } 
     } 
    } 
} 

家庭控制器

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 

namespace Website.Controllers 
{ 
    [HandleError] 
    public class HomeController : SectionController 
    { 
     public ActionResult Index() 
     { 
      return View(); 
     } 

     public ActionResult About() 
     { 
      return View(); 
     } 


     public ActionResult Contact() 
     { 
      return View(); 
     } 

    } 
} 

解決方案到目前爲止

ActionLink的

<%= Html.ActionLink("About Us", "About", new { SectionId = 1})%> 

SectionAttribute.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 

namespace Website.ActionFilters 
{ 
    public class SectionAttribute : ActionFilterAttribute 
    { 
     public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
     // Actions have sectionId parameter 
     object SectionId = filterContext.ActionParameters.FirstOrDefault(x => x.Key == "SectionId").Value; 

      if (SectionId != null && (int)SectionId == 1) 
      { 
       filterContext.Controller.ViewData["Message"] = "GOT AN ID"; 
      } 
      else 
      { 
       filterContext.Controller.ViewData["Message"] = "NO ID"; 
      } 
     } 
    } 
} 

SectionController

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using Website.ActionFilters; 

namespace Website.Controllers 
{ 
    [Section] 
    public class SectionController : Controller 
    { 
    } 
} 

查看

<%= Html.Encode(ViewData["Message"]) %> 

回答

2

您的代碼將無法使用。相反,您應該在基本控制器中定義OnActionExecuting方法,其中您從路由數據獲取實際的sectionId並相應地設置ViewData。嘗試是這樣的(未測試):

public class SectionController : Controller 
{ 
    protected override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     // Actions have no sectionId parameter - look for it in querystring 
     string SectionId = filterContext.HttpContext.Request.QueryString["sectionId"]; 

     int sId; 

     if (int.TryParse(SectionId, out sId) && sID == 1) 
     { 
      filterContext.Controller.ViewData["Message"] = "GOT AN ID"; 
     } 
     else 
     { 
      filterContext.Controller.ViewData["Message"] = "NO ID"; 
     } 
    } 
} 

更新時間:

您可以從出移動控制器和這個創造ActionFilter。這很簡單:

public class SectionAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     // Actions have sectionId parameter 
     object SectionId = filterContext.ActionParameters 
      .FirstOrDefault(x => x.Key == "sectionId").Value; 

     if (SectionId != null && (int)SectionID == 1) 
     { 
      filterContext.Controller.ViewData["Message"] = "GOT AN ID"; 
     } 
     else 
     { 
      filterContext.Controller.ViewData["Message"] = "NO ID"; 
     } 
    } 
} 

... 

[Section] 
public class SectionController : Controller { 

or 

[HandleError, Section] 
public class HomeController : SectionController { 
+0

+1更好的是,我們可以將它從基類中移出並放入一個action-filter/attribute讓它更優雅?謝謝 – 2010-02-02 12:58:36

+0

感謝您的幫助。我正在嘗試代碼,但我在OnActionExecuting上得到下面的錯誤。 錯誤'Website.Controllers.SectionController.OnActionExecuting(System.Web.Mvc.ActionExecutingContext)':當重寫'受保護的'繼承的成員'時,不能更改訪問修飾符'System.Web.Mvc.Controller.OnActionExecuting(System.Web .Mvc.ActionExecutingContext)' – Jemes 2010-02-02 14:15:22

+0

OnActionExecuted在控制器和公共過濾器中保護了修飾符 - 我已經修復了我的答案 – 2010-02-02 14:32:48

0

鹼控制器的構造通常不是其中公共代碼被放置的地方。您通常會爲通用代碼創建一個過濾器。如果使用此過濾器屬性修飾基礎控制器,則所有繼承控制器都使用該過濾器。

+0

我是新來的.net和mvc。我將如何去創建一個過濾器? – Jemes 2010-02-02 10:16:12

+0

試試這個http://www.asp.net/learn/mvc/tutorial-14-cs.aspx – 2010-02-02 10:36:32