1

NopCommerce プラグインを作成していて、ActionName を他のメソッドと共有している ActionMethod の FilterProvider にカスタム ActionFilter を登録したいと考えています。

同じ ActionName を持つ 2 つの ActionMethods を次に示します。

[HttpPost, ActionName("Edit")]
[FormValueRequired("cancelorder")]      
public ActionResult CancelOrder(int id)
{...}

[HttpPost, ActionName("Edit")]
[FormValueRequired("captureorder")]      
public ActionResult CaptureOrder(int id)
{...}

私のフィルター プロバイダーでは、どうにかして CancelOrder メソッドを CaptureOrder から分離する必要があります。

public class OrderFilterProvider : IFilterProvider
{
    private readonly IActionFilter _actionFilter;

    public OrderFilterProvider(IActionFilter actionFilter)
    {
        _actionFilter = actionFilter;
    }

    public IEnumerable<Filter> GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor)
    {       
        if (actionDescriptor.ControllerDescriptor.ControllerType == typeof(OrderController) &&
            actionDescriptor.ActionName.Equals("Edit"))
        {
            return new Filter[] 
            { 
                new Filter(_actionFilter, FilterScope.Action, null)
            };
        }

        return new Filter[] { };
    }
}

このコードでは、フィルターは CancelOrder と CaptureOrder の両方に登録されますが、CancelOrder メソッドだけに登録するにはどうすればよいですか?

私の考えは、メソッド名または FormValueRequired 属性のパラメーター値に基づいてそれらを分離することでしたが、それを行う方法を見つけることができませんでした。

FormValueRequired にはパブリック プロパティがなく、次のようになります。

public class FormValueRequiredAttribute : ActionMethodSelectorAttribute {
private readonly string[] _submitButtonNames;
private readonly FormValueRequirement _requirement;

public FormValueRequiredAttribute(params string[] submitButtonNames):
    this(FormValueRequirement.Equal, submitButtonNames)
{
}

public FormValueRequiredAttribute(FormValueRequirement requirement, params string[] submitButtonNames)
{
    //at least one submit button should be found
    this._submitButtonNames = submitButtonNames;
    this._requirement = requirement;
}
}

そして、これは私のデバッガーでどのように見えるかです: http://www.tiikoni.com/tis/view/?id=4843369

メソッドの名前を取得する方法はありませんか?

4

3 に答える 3

2

これらの 2 つのアクションの間に見られる唯一の違いは、カスタムFormValueRequired属性が存在することです。残念ながら、それが何をするのかを示したり説明したりしていませんが、それは何らかのアクション セレクターだと思います。とにかく、この属性を取得できます。

public IEnumerable<Filter> GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor)
{
    if (actionDescriptor.ControllerDescriptor.ControllerType == typeof(OrderController) &&
        actionDescriptor.ActionName.Equals("Edit"))
    {
        // Get the FormValueRequiredAttribute that was used to decorate the action
        var formValueRequiredAttribute = actionDescriptor
            .GetCustomAttributes(typeof(FormValueRequiredAttribute), false)
            .Cast<FormValueRequiredAttribute>()
            .FirstOrDefault();

        // if the action was decorated with this attribute we could read the
        // property that was passed to the constructor (hopefully it is exposed
        // as a public property)
        if (formValueRequiredAttribute != null && 
            formValueRequiredAttribute.SomeParameter == "captureorder")
        {
            // The CaptureOrder action was invoked
            return new Filter[] 
            { 
                new Filter(_actionFilter, FilterScope.Action, null)
            };
        }
    }

    return new Filter[] { };
}
于 2013-02-24T09:17:40.143 に答える
1

FormValueRequired 属性は、実際に投稿されたデータの「名前」をチェックします。したがって、POST されたフォームに「cancelorder」という名前の名前と値のペアがある場合、Action メソッドが実行されます。(興味深いことに、FormValueRequired は名前と値のペアの「名前」をチェックしますが、名前と値のペアの「値」はチェックしません)。

つまり、ActionFilter を保持し、両方のアクションが ActionFilter を起動できるようにします。ただし、実際の ActionFilter メソッドでは、POST されたフォームに適切な名前があるかどうかを次のコードで確認します。

controllerContext.HttpContext.Request.Form["cancelorder"];

OnXXX ActionFilter メソッド パラメータで ControllerContext を簡単に取得できます。:)

于 2013-03-05T16:51:23.280 に答える
0

注意すべき重要な点: FormValueRequired 属性は投稿されたデータの「名前」のみをチェックしますが、機能させるには値を指定する必要があります。

たとえば、これは機能しません。

<input type="submit" name="continueshopping" value="" class="continue-shopping-button" />

テキスト値のないボタンが欲しかったので、次のように値に空白を入力する必要がありました。

<input type="submit" name="continueshopping" value=" " class="continue-shopping-button" />
于 2013-10-17T13:53:46.390 に答える