2013-01-13 49 views
0

我有這樣的控制器:IModelBinder不開火MVC 3

[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());   
     } 

這是結合inplementation

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方式。
瀏覽器Ajax,瀏覽器經典表單提交,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(); 

感謝

+0

你是怎麼稱呼這個控制器動作的?當動作被調用時,模型聯編程序將被調用。 –

+0

@DarinDimitrov - 我打電話通過網絡表單。 我可以調用'Execute(PaymentModel paymentModel)'而不是之前的模型。 – SexyMF

+0

你能告訴你如何打電話嗎?你在提交的視圖中有一些HTML表單嗎?或者你在使用AJAX?或者以其他方式來調用這個動作? –

回答

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. 的HomeController:

    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. 調試模式運行該應用程序,提交表單和自定義模型聯編程序被擊中。

所以現在的問題就變成了:你有什麼不同?

+0

我剛剛做了,它工作。它可以是ninject嗎?我編輯我的帖子並將其添加到底部 – SexyMF

+0

@SexyMF,是的,許多事情都可能導致這種情況。不幸的是,我不是一個oracle,不能遠程閱讀或理解你可以假設編寫的代碼。但這不太可能是由NInject引起的。我會建議你開始消除原因。從工作狀態開始(請參閱我的答案),然後逐步開始添加內容,直到代碼停止工作。現在你將會隔離這個問題,並且會找到吸菸槍。祝你好運。 –

+0

我會的,謝謝。 – SexyMF