Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

180
Views
Anulación del archivador de modelos MVC 5

Escribí una anulación de Model Binder.

 public override object BindModel(Controller context, ModelBindingContext bindingContext) { var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); object returnVal = null; if (value == null) returnVal = base.BindModel(controllerContext, bindingContext); else { /* custom logic here that never seems to get called. returnVal = something(); */ } return returnVal; }

También tengo un servicio de javascript (en Angular) que realiza una solicitud AJAX a uno de mis controladores.

La solicitud AJAX intenta publicar una colección de ints. Intenté recorrer la carpeta del modelo y parece que el value siempre es nulo. Y por un poco de magia, base.BindModel() aún puede vincular mi colección al objeto C# correcto.

El problema con esto es que no puedo usar mi carpeta personalizada ya que el bloque else nunca se invoca. ¿Hay otra forma de obtener el valor además de usar ValueProvider ?

También creo que antes este archivador personalizado funcionaba correctamente (de memoria que podría estar mal). Recientemente actualicé de 4.5 a 5.2.algo. ¿Hay algo que se actualizó que podría haber cambiado este comportamiento?

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

También tengo un servicio de javascript (en Angular) que realiza una solicitud AJAX a uno de mis controladores.

...

El problema con esto es que no puedo usar mi carpeta personalizada ya que el bloque else nunca se invoca.

  • Voy a suponer que ha registrado correctamente su carpeta, ya sea globalmente O en la acción misma en uno o más de los parámetros.
  • También asumiré que su carpeta está siendo llamada cuando espera que lo haga.

Es nulo porque no puede encontrar los datos basados en el nombre de su modelo al que está tratando de vincularse. Si el valor se puede encontrar con este nombre depende del nombre del modelo y los datos enviados en la solicitud del cliente que deben alinearse/coincidir. Pero antes de que alguien pueda decirle por qué los datos no coinciden (incluido su modelo con la matriz) se pueden enviar desde el cliente de una de estas tres maneras:

  1. Si usa la URL, reutilizará el mismo nombre de propiedad en la cadena de consulta. Ejemplo: ?myArray=1&myArray=2&myArray=3 . Esto significa que en la carpeta de tu modelo tendrás que considerar esto.
  2. Si usa los data (cuerpo) en un POST, entonces podría ser un objeto de matriz real. Ejemplo en json: {"myArray":[1,2,3,4]}
  3. También podría serializar todo el formulario y enviarlo con Angular ( lo que le permitiría utilizar mejor la funcionalidad de enlace en MVC )

Entonces, para responder mejor a su pregunta, deberá proporcionar

  1. El formato de los datos se envía desde el navegador y cómo se envía (cadena de consulta o en la carga útil de datos) ( esto probablemente esté en su fábrica, servicio o controlador de Angular )
  2. La definición del modelo que está tratando de vincular a

Entonces, para recapitular: bindingContext.ModelName es el nombre esperado y debe coincidir con los datos que su enlazador de modelos está tratando de encontrar. Si está enviando {"myArray":[1,2,3,4]} pero la propiedad de su modelo se llama ProductIds , entonces siempre será nulo.

Recientemente actualicé de 4.5 a 5.2.algo

No, no que yo sepa.


Pensamiento final. También puede dejar que se ejecute el enlazador de modelos predeterminado y luego hacer algo con el valor devuelto si los tipos coinciden. Si el enlace se realiza ahora sin problemas, pero desea realizar un procesamiento posterior, esta sería una mejor opción. Ejemplo:

 public override object BindModel(Controller context, ModelBindingContext bindingContext) { var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); object returnVal = base.BindModel(controllerContext, bindingContext); /* check returnVal and then additional custom logic here */. return returnVal; }
over 4 years ago · Santiago Trujillo Report

0

Por favor, asegúrese de haber hecho algo como esto: -

  1. Encuadernación de modelo personalizado:-

     public class HomeCustomDataBinder : DefaultModelBinder { public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { if (bindingContext.ModelType == typeof(HomePageModels)) { HttpRequestBase request = controllerContext.HttpContext.Request; string title = request.Form.Get("Title"); string day = request.Form.Get("Day"); string month = request.Form.Get("Month"); string year = request.Form.Get("Year"); return new HomePageModels { Title = title, Date = day + "/" + month + "/" + year }; //// call the default model binder this new binding context //return base.BindModel(controllerContext, newBindingContext); } else { return base.BindModel(controllerContext, bindingContext); } } }
  2. Una vez que hayamos completado la codificación de nuestra clase personalizada, necesitaremos registrar la clase que hago en Global.asax en Application_Start().

     protected void Application_Start() { AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); AuthConfig.RegisterAuth(); ModelBinders.Binders.Add(typeof(HomePageModels), new HomeCustomBinder()); }

    3) Finalmente, debemos informar al controlador sobre el enlace que queremos que use. Esto lo podemos especificar usando los atributos [ModelBinder(typeof(HomeCustomBinder))] como se muestra a continuación:

     [HttpPost] public ActionResult Index([ModelBinder(typeof(HomeCustomBinder))] HomePageModels home) { if (ModelState.IsValid) { ViewBag.Title = home.Title; ViewBag.Date = home.Date; } return View(); }
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!