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);

アクションに[削除]属性がある場合、ActionDescriptorはnullです。コントローラコンテキストからアクション名を取得する方法はありますか?

4

1 に答える 1

13

FindActionメソッドはget属性のみを検索するため、.net4.5でも同じ問題が発生しました。GetCanonicalActionsメソッドを使用して2番目の検索を追加する問題を解決しました。

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を使用しているので、rember add using System.Linq;

于 2013-02-06T19:23:21.173 に答える