2010-02-15 5 views
0

Est-il possible pour une classe Controller Base d'accéder à un paramètre à partir d'une liaison d'action et si oui, comment puis-je accéder à ce paramètre dans mon contrôleur de base?Classe de base Accès à un paramètre

action Lien:

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

classe contrôleur base:

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

Votre question ... cela n'a aucun sens. – Will

+0

Désolé. Le problème que je rencontre est que je ne peux pas accéder au Parameter SectionID dans ma classe Base Contoller. – Jemes

+0

Etes-vous sûr que SectionId est passé en tant que paramètre de chaîne de requête? Si l'un de vos itinéraires le déclare comme argument RouteData, il ne sera pas transmis via la chaîne de requête. –

Répondre

1

La classe de base ne peut pas accéder à des arguments passés à une action de contrôleur, mais il le peut obtenir des données sur RouteData. Donc, si vous voulez SectionId faire partie de votre itinéraire, plutôt que d'un argument querystring, vous pouvez faire:

// 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; 
} 

Si vous passez SectionId comme paramètre querystring alors le code affiché devrait fonctionner ... ne pas?

+0

Merci pour les réponses. Je crois que je passe SectionID comme une chaîne de requête. Lorsque je place le code Request.QueryString dans mon Home Controller, cela fonctionne très bien, mais pas dans mon contrôleur de base. – Jemes

+0

Cela semble très étrange. Peut-être que vous devriez poster les parties pertinentes de HomeController et BaseController. En outre, si vous connectez un débogueur et parcourez le code, obtenez-vous différentes valeurs QueryString? –

+0

J'ai mis à jour ma question. – Jemes

0

Généralement vous auriez une propriété dans BaseController que vous définissez dans un filtre.

Quelque chose comme

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

Mais méfiez-vous que cette propriété ne doit pas être utilisé dans d'autres filtres, parce que l'ordre d'exécution n'est pas prévisible par défaut.

+0

Pourquoi préférez-vous cela sur une propriété du contrôleur de base qui indexe dans ViewData? Je l'ai fait dans les deux sens mais j'aime bien la propriété plus ... il semble un peu plus explicite (b/c vous pouvez facilement dire à partir de la déclaration de la propriété d'où provient la valeur) plus il vous permet d'utiliser la valeur autres filtres d'action. Normalement, j'utilise une propriété paresseuse qui enveloppe ViewData, sauf si une valeur est explicitement définie, ce qui me permet de coder facilement une valeur lors des tests. –

+0

Pour être honnête, je n'ai jamais eu l'idée que tu as montrée. Mon contrôleur de base a très peu de code. Votre solution a définitivement du sens. –

Questions connexes