2010-02-15 11 views
0

컨트롤러 기본 클래스가 작업 링크에서 매개 변수에 액세스 할 수 있습니까? 그렇다면 내 기본 컨트롤러에서 해당 매개 변수에 액세스하는 방법은 무엇입니까?기본 클래스 매개 변수 액세스

액션 링크 :

<%=Url.Action("Area_1419", "Home", new { SectionId = 1})%> 

기본 컨트롤러 클래스 :

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

namespace Website.Controllers 
{ 
    public abstract class CategoriesController : Controller 
    { 
     public CategoriesDataContext _dataContext = new CategoriesDataContext(); 

     public CategoriesDataContext DataContext 
     { 
      get { return _dataContext; } 
     } 

     public void SectionID() 
     { 
      int SectionID = Convert.ToInt32(Request.QueryString["SectionID"]); 
      ViewData["SectionID"] = SectionID; 
     } 

     public CategoriesController2() 
     { 
      //ViewData["Categories"] = from m in _dataContext.Categories where m.Area_ID == SectionID select m; 
      //ViewData["Categories"] = from c in DataContext.Categories select c; 
     } 
    } 
} 

HomeContoller

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

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

     public ActionResult About(int? SectionID) 
     { 
      //ViewData["Message"] = SectionID; 
      return View(); 
     } 

     public ActionResult Area_1419(int SectionID) 
     { 
      return View(); 
     } 


     public ActionResult Admin() 
     { 
      return View(); 
     } 
    } 
} 
+0

귀하의 질문 .... 그것은 말이되지 않습니다. – Will

+0

죄송합니다. 내가 가지고있는 문제는 Base Contoller 클래스의 Parameter SectionID에 액세스 할 수 없다는 것입니다. – Jemes

+0

SectionId가 쿼리 문자열 매개 변수로 전달되고 있습니까? 루트 중 하나가 RouteData 인수로 선언하면 쿼리 문자열을 통해 전달되지 않습니다. –

답변

1

기본 클래스는 컨트롤러 액션에 전달 된 인수에 액세스 할 수 있지만,이 을 할 수 데이터를 RouteData에서 가져옵니다. 당신이 SectionId 오히려 쿼리 문자열 인수보다, 경로의 일부가되고 싶다면, 당신은 할 수 :

// Global.asax 
routes.MapRoute(
    "WithSection", 
    "{sectionId}/{controller}/{action}/{id}", 
    new { section = String.Emtpy, action = "index", id = String.Empty } 
); 

// base controller class 
public void SectionID() 
{ 
    int SectionID = Convert.ToInt32(RouteData["SectionID"]); 
    ViewData["SectionID"] = SectionID; 
} 

당신은 당신이 게시 코드가 작동해야 쿼리 문자열 매개 변수로 SectionId을 통과하는 경우 ... 수행 그렇지 않니?

+0

답장을 보내 주셔서 감사합니다. 나는 SectionID를 쿼리 문자열로 전달합니다. 내 Home Controller에 Request.QueryString 코드를 삽입하면 올바르게 작동하지만 내 Base Controller에서는 작동하지 않습니다. – Jemes

+0

매우 이상하게 들립니다. 아마도 HomeController와 BaseController의 관련 부분을 게시해야합니다. 또한 디버거를 연결하고 코드를 단계별로 실행하면 다른 QueryString 값을 얻게됩니까? –

+0

내 질문을 업데이트했습니다. – Jemes

0

일반적으로 필터에 설정 한 BaseController의 속성이 있습니다.

뭔가

public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
       ((BaseController)filterContext.Controller).SectionID = "Something"; 
    } 

그러나 실행 순서는 기본적으로 예측하지 않기 때문에이 속성이 다른 필터에 사용되어서는 안된다는주의

있다.

+0

ViewData에 색인을 생성하는 기본 컨트롤러의 속성보다 더 선호하는 이유는 무엇입니까? 나는 두 가지 방법으로 모두 해왔지만 속성이 더 마음에 든다. 좀 더 명시 적으로 보인다. (값이 어디에서 왔는지 속성 선언에서 쉽게 알 수있다.) 다른 액션 필터. 일반적으로 값을 명시 적으로 설정하지 않으면 ViewData를 래핑하는 지연로드 된 속성을 사용하므로 테스트 중에 값을 쉽게 하드 코딩 할 수 있습니다. –

+0

솔직히 말해서 나는 당신이 보여준 아이디어를 결코 얻지 못했습니다. 베이스 컨트롤러에는 코드가 거의 없습니다. 당신의 솔루션은 확실히 의미가 있습니다. –

관련 문제