操作参数无键时添加默认值

时间:2010-02-15 16:26:14

标签: asp.net-mvc

当ActionParameter为空时,如何在Action Filter中设置默认值?

当我在控制器上使用关于 Area_1419操作时,过滤器可以正常运行,因为它会获取传递的 SectionID参数。当我使用索引操作时,我得到以下错误....

字典中没有给定的密钥。 在这条线上......

var GetSectionID = filterContext.ActionParameters["SectionID"];

我不会将SectionID参数添加到每个控制器操作,因为它仅适用于某些部分,我不想将过滤器添加到每个操作,因为过滤器会影响这些页面。

如果SectionID没有值,是否可以在过滤器中为SectionID设置默认值?

CategoriesAttribute

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

namespace Website.ActionFilters
{
    public class CategoriesAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            var GetSectionID = filterContext.ActionParameters["SectionID"];
            var NoSectionID = 1;

            if (GetSectionID == null)
            {
                filterContext.Controller.ViewData["SectionID"] = NoSectionID;
            }
            else
            {
                filterContext.Controller.ViewData["SectionID"] = GetSectionID;
            }              
        }
    }
}

家庭控制器

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,Categories]
    public class HomeController : Controller
   {
        public ActionResult Index()
        {
            return View();
        }

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

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

1 个答案:

答案 0 :(得分:3)

ActionParameters是一个字典;首先通过ActionParameters.ContainsKey(“SectionID”)检查密钥。使用字典,检查密钥永远不会返回null,但会抛出该异常,因为它始终需要密钥。

if (filterContext.ActionParameters.ContainsKey("SectionID"))
{
   //Code to process as section ID
   filterContext.Controller.ViewData["SectionID"] = filterContext.ActionParameters["SectionID"]; 
}
else
{
   //Code to process as if no section ID
   filterContext.Controller.ViewData["SectionID"] = 1;
}