Базовый класс Доступ к параметру - PullRequest
0 голосов
/ 15 февраля 2010

Возможно ли для базового класса контроллера доступ к параметру по ссылке действия, и если да, то как мне получить доступ к этому параметру в моем базовом контроллере?

Ссылка на действие:

<%=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();
        }
    }
}

Ответы [ 2 ]

1 голос
/ 15 февраля 2010

Базовый класс не может получить доступ к аргументам, переданным действию контроллера, но он может получить данные из 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 голосов
/ 15 февраля 2010

Обычно у вас будет свойство в BaseController, которое вы устанавливаете в фильтре.

Что-то вроде

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

Но учтите, что это свойство не должно использоваться в других фильтрах, поскольку порядок выполнения по умолчанию не предсказуем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...