65.9K
CodeProject 正在变化。 阅读更多。
Home

自定义 MVC 操作方法选择器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.27/5 (7投票s)

2011年11月28日

CPOL

2分钟阅读

viewsIcon

48826

downloadIcon

503

实现自定义的 ActionMethodSelector 属性方法,将看似复杂的事情变得简单。

引言

ASP.NET MVC 框架调用操作的标准路由算法类似于 {controller}/ {action}/ {id} 模式。

但是,当您有两个同名方法,或者在提交表单数据时调用操作,或者仅在发出 AJAX 请求时执行方法时,这会变得更加复杂。

实现

DisplayApplication.JPG

可以使用 ActionMethodSelector 属性来完成此操作。 我们通常使用像这样的方法选择器:

  1. AcceptVerbs
  2. ActionName

AcceptVerbs

当您希望在执行特定 HTTP 操作(如 POST、GET、DELETE 等)时执行某些操作时,使用此属性。 例如:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(Employee employee)
{
      // To Do Code Here
}

当执行 HTTP POST 操作时,将执行上述方法。

AcceptName

当您使用与方法名称不同的名称公开操作名称时,或者您可以使用操作名称属性以不同的名称将两个同名方法公开为操作时,使用此属性。 例如:

[ActionName(“Edit”)]
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Edit_GET(Employee  employee)
{
    // To Do Code Here
}
[ActionName(“Edit”)]
[AcceptVerbs(HttpVerbs.Post)]
Public ActionResult Edit_POST(Employee employee)
{
    // To Do Code Here
}

自定义操作方法选择器

您可以通过从抽象类 ActionMethodSelectorAttribute 派生来构建自己的 ActionMethodSelector 属性。

这是一个非常简单的类;您只需要重写名为 IsValidForRequest () 的方法。 如果此方法返回 false,则不会执行此操作方法。

现在,举一个自定义操作方法选择器的简单例子。 开发一个 Ajaxmethod 自定义属性,当您希望在发出 AJAX 请求时执行某些操作时,该属性很有用。

第一步是创建一个 MVC 应用程序。 然后添加一个名为 AjaxMethod.cs 的类文件,并从 ActionMethodSelectorAttribute 继承该类。 然后重写一个名为 IsValidForRequest() 的方法。 您的类将如下所示:

public class AjaxMethod:ActionMethodSelectorAttribute
{
   public override bool IsValidForRequest(ControllerContext controllerContext, 
          System.Reflection.MethodInfo methodInfo)
   {
       return controllerContext.HttpContext.Request.IsAjaxRequest();
   }
}

IsValidForReuest 方法中,我们检查 Request 对象是否存在 AJAX 请求。

现在,当您希望仅在收到 AJAX 请求时执行某些操作时,可以在控制器中使用 Ajaxmethod 属性。 为此,将一个名为 NewsController 的控制器添加到控制器文件夹中。 在此控制器中,我们定义两个 index 操作:第一个 index 操作仅在页面回发时执行,第二个操作在收到 AJAX 请求时调用。 您的控制器将如下所示:

public class NewsController : Controller
{

    private readonly List<string> _news = new List<string>();
    private Random _rnd = new Random();

    public NewsController()
    {
        _news.Add("Moon Explodes");
        _news.Add("Stock Market up 200 percent");
        _news.Add("Talking Robort Created!");
    }
    //
    // GET: /News/

    public ActionResult Index()
    {
        var SelectedIndex = _rnd.Next(_news.Count);
        ViewData["News"] = _news[SelectedIndex];
        return View();
    }


    [AjaxMethod]
    [ActionName("Index")]
    public string Index_AJAX()
    {
        var SelectedIndex = _rnd.Next(_news.Count);
        return _news[SelectedIndex];
    }
}

现在添加一个名为 index.aspx 的视图来显示新闻,并将以下标记添加到该视图中:

<script type="text/javascript" src="../../Scripts/MicrosoftAjax.js"></script>
    <script type="text/javascript" src="../../Scripts/MicrosoftMvcAjax.js"></script>
      <%= Ajax.ActionLink("Get News", "Index", new AjaxOptions { UpdateTargetId = "news" })%>
      <span id="news"%><%:ViewData["News"] %></span>

现在运行应用程序。 您会发现,当页面第一次加载时,第一个 index 操作执行,当您单击“GetNews”链接时,第二个 index 操作执行。 第一次,它会检查 Ajaxmethod 属性,但 IsValidForRequest 方法将返回 false,然后它将执行第一个 index 操作,但是当您单击该链接时,IsValidForRequest 返回 true 并执行第二个操作。

结论

ASP.NET MVC 中一些定制性最少但非常有用的扩展点是操作方法选择器属性。 但是,通过使用它们,我们可以将看似复杂的事情变得简单。

© . All rights reserved.