Базовый контроллер Получить значение - PullRequest
2 голосов
/ 02 февраля 2010

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

Ссылка

<%= 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
    {
    }
}

View

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

Ответы [ 2 ]

2 голосов
/ 02 февраля 2010

Ваш код не будет работать. Вместо этого вы должны определить 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 голосов
/ 02 февраля 2010

Конструктор базового контроллера обычно не является местом, где размещается общий код. Вы обычно создаете фильтр для общего кода. Если вы украсите базовый контроллер этим атрибутом фильтра, тогда все наследующие контроллеры будут использовать этот фильтр.

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