8

控制器:

[HttpDelete]
public ActionResult Delete(int id)
{
}

方法:

ControllerBase controllerToLinkTo = string.IsNullOrEmpty(controllerName)
                                        ? htmlHelper.ViewContext.Controller
                                        : GetControllerByName(htmlHelper, controllerName);

var controllerContext = new ControllerContext(htmlHelper.ViewContext.RequestContext, controllerToLinkTo);
var controllerDescriptor = new ReflectedControllerDescriptor(controllerToLinkTo.GetType());
ActionDescriptor actionDescriptor = controllerDescriptor.FindAction(controllerContext, actionName);

当动作具有 [Delete] 属性时,ActionDescriptor 为空。有没有办法从控制器上下文中获取动作名称?

4

1 回答 1

13

我在 .net 4.5 中遇到了同样的问题,因为 FindAction 方法只搜索 get 属性。我解决了使用 GetCanonicalActions 方法添加第二次搜索的问题。

ControllerBase controllerToLinkTo = string.IsNullOrEmpty(controllerName)
                                                        ? htmlHelper.ViewContext.Controller
                                                        : GetControllerByName(htmlHelper, controllerName);

var controllerContext = new ControllerContext(htmlHelper.ViewContext.RequestContext, controllerToLinkTo);
var controllerDescriptor = new ReflectedControllerDescriptor(controllerToLinkTo.GetType());
var actionDescriptor = controllerDescriptor.FindAction(controllerContext, actionName);

//add the following lines
if (actionDescriptor == null)
{
    actionDescriptor = controllerDescriptor.GetCanonicalActions().FirstOrDefault(a => a.ActionName == actionName);
}

注意:我使用的是 linq 方法 FirstOrDefault,所以请记住 add using System.Linq;

于 2013-02-06T19:23:21.173 回答