1

コントローラーのアクション メソッドにカスタム フィルターを渡したいです。私はそれをそのように定義しようとします。

public ActionResult GetResult(Func<Fault,bool> filter)
{
    List<Fault> faultList;
    using (var _context = new myDB())
    {
        faultList = 
            from f in _context.Faults
            where filter(f)
            select f;
    }
    return Json(faultList);
}

しかし、アクションを実行するとエラーが発生します

このオブジェクトにはパラメーターなしのコンストラクターが定義されていません。

System.RuntimeTypeHandle.CreateInstance (RuntimeType タイプ、ブール型 publicOnly、ブール型 noCheck、ブール型 & canBeCached、RuntimeMethodHandleInternal & ctor、ブール型 & bNeedSecurityCheck) で System.RuntimeType.CreateInstanceSlow (ブール型 publicOnly、ブール型 skipCheckThis、ブール型 fillCache、StackCrawlMark & stackMark) で System.RuntimeType.CreateInstanceDefaultCtor (Boolean publicOnly、Boolean skipCheckThis、Boolean fillCache、StackCrawlMark& stackMark) System.Activator.CreateInstance(Type タイプ、Boolean nonPublic) で System.Activator.CreateInstance(Type タイプ) System.Web.Mvc.DefaultModelBinder.CreateModel(ControllerContext controllerContext、 ModelBindingContext bindingContext、型 modelType) で System.Web.Mvc.DefaultModelBinder.BindComplexModel (ControllerContext controllerContext、System.Web.Mvc.ControllerActionInvoker.GetParameterValue(ControllerContext controllerContext、ParameterDescriptor parameterDescriptor) で System.Web.Mvc.ControllerActionInvoker.GetParameterValues(ControllerContext controllerContext) で System.Web.Mvc.DefaultModelBinder.BindModel(ControllerContext controllerContext、ModelBindingContext bindingContext) で ModelBindingContext bindingContext) 、ActionDescriptor actionDescriptor) で System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) で System.Web.Mvc.Controller.ExecuteCore() で System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) で System. System.Web.Mvc.MvcHandler.<>c_ の Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext)System.Web.Mvc.ControllerActionInvoker.GetParameterValue(ControllerContext controllerContext, ParameterDescriptor parameterDescriptor) の BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) System.Web.Mvc.ControllerActionInvoker.GetParameterValues(ControllerContext controllerContext, ActionDescriptor actionDescriptor) の System.Web.Mvc.ControllerActionInvoker System.Web.Mvc.ControllerBase.System.Web.Mvc. System.Web.Mvc.MvcHandler.<>c_ の IController.Execute(RequestContext requestContext)System.Web.Mvc.ControllerActionInvoker.GetParameterValue(ControllerContext controllerContext, ParameterDescriptor parameterDescriptor) の BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) System.Web.Mvc.ControllerActionInvoker.GetParameterValues(ControllerContext controllerContext, ActionDescriptor actionDescriptor) の System.Web.Mvc.ControllerActionInvoker System.Web.Mvc.ControllerBase.System.Web.Mvc. System.Web.Mvc.MvcHandler.<>c_ の IController.Execute(RequestContext requestContext)System.Web.Mvc.ControllerActionInvoker.GetParameterValues(ControllerContext controllerContext, ActionDescriptor actionDescriptor) の GetParameterValue(ControllerContext controllerContext, ParameterDescriptor parameterDescriptor) System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) の System.Web.Mvc.Controller .ExecuteCore() で System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) で System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) で System.Web.Mvc.MvcHandler.< >c_System.Web.Mvc.ControllerActionInvoker.GetParameterValues(ControllerContext controllerContext, ActionDescriptor actionDescriptor) の GetParameterValue(ControllerContext controllerContext, ParameterDescriptor parameterDescriptor) System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) の System.Web.Mvc.Controller .ExecuteCore() で System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) で System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) で System.Web.Mvc.MvcHandler.< >c_InvokeAction(ControllerContext controllerContext, String actionName) で System.Web.Mvc.Controller.ExecuteCore() で System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) で System.Web.Mvc.ControllerBase.System.Web.Mvc.IController .Execute(RequestContext requestContext) で System.Web.Mvc.MvcHandler.<>c_InvokeAction(ControllerContext controllerContext, String actionName) で System.Web.Mvc.Controller.ExecuteCore() で System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) で System.Web.Mvc.ControllerBase.System.Web.Mvc.IController .Execute(RequestContext requestContext) で System.Web.Mvc.MvcHandler.<>c_DisplayClass6 .<>c _DisplayClassb.b_ 5() System.Web.Mvc.Async.AsyncResultWrapper.<>c _DisplayClass1.b_ 0() System.Web.Mvc.Async.AsyncResultWrapper.<>c _DisplayClass8 1.b__7(IAsyncResult _) at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult1.End( ) System.Web.Mvc.MvcHandler。 Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) で System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult 結果) で System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute( ) System.Web.HttpApplication.ExecuteStep (IExecutionStep ステップ、ブール値 & completedSynchronously) で

そのようなことをすることは可能ですか?

デリゲートを渡さない場合、別の方法を提案できますか?

4

4 に答える 4

2

あなたの質問を理解したので、それは不可能だと思います。

コントローラの ASP NET MVC アクション メソッドは、HTTP リクエストのマッピング (URL ルーティング) に対する一種のエントリ ポイントであり、HTTP リクエストの受信後にアクション メソッドが起動されます。実際、メソッドの入力パラメーターは、HTTP 要求から厳密に型指定されたオブジェクトへの Post または Get パラメーターを逆シリアル化 (またはマッピング) した結果です。MVC フレームワークがオブジェクトを作成するとき、パラメーターなしのコンストラクターを探します。これは、参照型のデータ コンテナーに関連しています。

もう 1 つのことは、http 要求を介して機能 (ロジック) を送信し、それを NET デリゲートにマッピングすることです。NET はインタープリターではなくコンパイル フレームワークであるため、NET コードをテキスト (C# コードなど) として送信し、デリゲートにマッピングする方法はありません (たとえば、Action メソッドから JavaScript コードを返すことができます)。

最後に、実行時に NET コードをコンパイルできたとしても (いくつかのメソッドがあります)、アクション メソッドに NET コードを挿入する可能性があると、セキュリティ上の問題が発生します。

于 2013-05-13T00:23:12.567 に答える
0

デリゲートを渡すことは間違いなく可能です。以下のようなコマンドクラスがあるとしましょう

public class MyCommand<T>{

Action myAction;
Func<T, bool> canExecute;

public MyCommand(Action<T> actionToBeExecuted, Func<T, bool> canExecute)
{
this.myAction = actionToBeExecuted;
this.canExecute = canExecute;
}

public void ExecuteMyCommand<T>(T param)
{
if(this.canExecute(param))
   this.myAction(param);
}
}

上記のコードは例を示しており、その方向に進むことができると思います。

于 2013-03-28T10:05:28.180 に答える
0

デリゲートをアクションに渡すことができるかどうかはわかりませんが、代わりの提案があります。アクションにパラメーターを渡し、filterその値に基づいて適切な関数をデリゲートに割り当てることができます。

私のアイデアを説明するためのサンプル コンソール アプリを次に示します。

public enum Cases { Case1, Case2, Case3 };

class Program
{
    private static bool Test1(int test) { return test == 1; }

    private static bool Test2(int test) { return test == 2; }

    private static bool Test3(int test) { return test == 3; }

    public static void Main()
    {
        RunTest(Cases.Case1);
        RunTest(Cases.Case2);
        RunTest(Cases.Case3);

        Console.ReadLine();
    }


    private static void RunTest(Cases testCase)
    {
        var list = new List<int> {1, 2, 3};
        Func<int, bool> del;

        switch (testCase)
        {
            case Cases.Case1:
                del = Test1;
                break;
            case Cases.Case2:
                del = Test2;
                break;
            case Cases.Case3:
                del = Test3;
                break;
            default:
                throw new InvalidDataException();
        }

        list.ForEach( i => Console.WriteLine(del(i) ? i.ToString() : "--")  );
    }
}
于 2013-03-28T06:13:41.717 に答える