0

私はこのコントローラーを持っています:

[HttpPost]
public JsonResult Execute(PaymentModel paymentModel){...}

これがモデルです

public class PaymentModel
{
[Required]
[DisplayName("Full name")]
public string FullName { get; set; }
...
}

これがバインディングアクションです

 protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            RegisterGlobalFilters(GlobalFilters.Filters);
            RegisterRoutes(RouteTable.Routes);
            ModelBinders.Binders.Add(typeof(PaymentModel), new PaymentModelsBinding());           
        }

これはバインディングの実装です

public class PaymentModelsBinding : IModelBinder
    {
        public  object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
//Cant get to here with the debugger
}

それが関連しているかどうかはわかりませんが、Ninject を使用してコントローラー コンストラクターに注入しています。

更新 これは、フォームの送信方法です。

            $.ajax({
                type: 'POST',
                url: $("#form").attr("action"),
                data: $("#form").serialize(),
                success: function (json) {
                    ...

                },
                dataType: "Json"
            });

つまり、可能な限りすべての WEB 方法で呼び出します。
Browser Ajax、Browser Classic フォーム送信、WebClient など。

更新 これは私のninjectコードです:

kernel.Components.Add<IInjectionHeuristic, CustomInjectionHeuristic>();


            kernel.Bind<IPaymentMethodFactory>().ToProvider<PaymentMethodFactoryProvider>().InSingletonScope();
            kernel.Bind<IDefaultBll>().To<DefaultBll>().InSingletonScope();

            kernel
                .Bind<IDalSession>()
                .ToProvider<HttpDalSessionProvider>()
                .InRequestScope();

ありがとう

4

1 に答える 1

1

申し訳ありませんが、コードに問題はありません。これはうまくいくはずです。概念実証として、次のことを試すことができます。

  1. インターネット テンプレートを使用して新しい ASP.NET MVC 3 アプリケーションを作成する
  2. ビュー モデルを定義します。

        public class PaymentModel
        {
            [Required]
            [DisplayName("Full name")]
            public string FullName { get; set; }
        }
    
  3. カスタム モデル バインダー:

    public class PaymentModelsBinding : IModelBinder
    {
        public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            return new PaymentModel();
        }
    }
    
  4. ホームコントローラー:

    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View(new PaymentModel());
        }
    
        [HttpPost]
        public ActionResult Index(PaymentModel model)
        {
            return Json(new { success = true });
        }
    }
    
  5. 対応するビュー ( ~/Views/Home/Index.cshtml):

    @model PaymentModel
    
    @using (Html.BeginForm(null, null, FormMethod.Post, new { id = "form" }))
    {
        @Html.EditorFor(x => x.FullName)
        <button type="submit">OK</button>
    }
    
    <script type="text/javascript">
        $('#form').submit(function () {
            $.ajax({
                type: this.method,
                url: this.action,
                data: $(this).serialize(),
                success: function (json) {
    
                }
            });
            return false;
        });
    </script>
    
  6. 最後に、モデル バインダーを次のように登録しApplication_Startます。

    ModelBinders.Binders.Add(typeof(PaymentModel), new PaymentModelsBinding());
    
  7. アプリケーションをデバッグ モードで実行し、フォームを送信すると、カスタム モデル バインダーがヒットします。

そこで質問は次のようになります。

于 2013-01-13T12:26:40.167 に答える