Проблемы привязки базовой модели .NET - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть контроллер ASP.NET Core, подобный этому

[ApiController]
public class MADEController : Controller
{
   private readonly IRepository _repository;

   public MADEController( IRepository repository)
   {
       _repository = repository;
   }

   [HttpPost]
   [Route("DKAPI/MADE/Update/{tblId}/{recId}")]
   public HttpResponseMessage Update(string tblId, string recId, object formParams)
   {
      var temp = JsonConvert.SerializeObject(HttpContext.Request.Form.ToList());
   }
}

Если я пытаюсь вызвать действие обновления через Advanced Rest Client, используя URL-адрес запроса

http://localhost:10356/DKAPI/MADE/Update/32/5

и вPOST Body следующее:

[{"Key":"formParams","Value":["[{\"key\":\"id\",\"value\":\"5\"},{\"key\":\"CarRegNo\",\"value\":\"HKK36512\"},{\"key\":\"CarEngSize\",\"value\":\"1234\"},{\"key\":\"DateCreated\",\"value\":\"19/09/2018 00:00\"},{\"key\":\"ExpenseStatus\",\"value\":\"U\"},{\"key\":\"DateCertified\",\"value\":\"\"},{\"key\":\"ClaimFrom\",\"value\":\"10/09/2018\"},{\"key\":\"ClaimTo\",\"value\":\"27/09/2018\"},{\"key\":\"TotalMilesuptothisclaim\",\"value\":\"\"},{\"key\":\"Staff\",\"value\":\"\"}]"]}]

tblId получает значение 32, recId получает значение 5, НО объект formParams остается всегда пустым.С другой стороны, строка

var temp = JsonConvert.SerializeObject(HttpContext.Request.Form.ToList());

печатает вышеупомянутый объект.Есть идеи, почему это происходит?Я что-то упускаю при связывании моделей в .NET Core?Раньше он работал в .NET 4.6 1, но в .NET Core он не работал

Для соглашения я добавляю сюда свой файл startup.cs.

public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {

            //Database connection
            var connectionString = Configuration.GetConnectionString("DBConnectionStringName");

            //SOS Add Cors before MVC
            services.AddCors();


            //Register Repositories
            services.AddScoped<IRepository, Repository>();
            //The following line is added in order to have access on the HttpContext in controllers
            services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();



            services
                .AddMvc()
                .AddWebApiConventions()
                .SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
                .AddJsonOptions(options =>
                {
                    options.SerializerSettings.ContractResolver = new DefaultContractResolver();
                    options.SerializerSettings.SerializationBinder = new DefaultSerializationBinder();

                });
            services.Configure<ApiBehaviorOptions>(options =>
            {
                options.SuppressConsumesConstraintForFormFileParameters = true;
                options.SuppressInferBindingSourcesForParameters = true;
                options.SuppressModelStateInvalidFilter = true;
            });

            services.AddKendo();
            services.AddTransient<IAuthorizationHandler, TokenHandler>();

            services.AddAuthorization(options =>
            {
                options.AddPolicy("Token", policy =>
                    policy.Requirements.Add(new TokenRequirement()));
            });
            services.AddAuthentication(options =>
            {
                options.DefaultChallengeScheme = "DR";
                options.AddScheme<DKSchemeHandler>("DR", "DataVision");
            });

        }

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {

            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            app.UseStaticFiles();
            app.UseAuthentication();

            app.UseOwin();
            //SOS Add Cors before MVC
            app.UseCors(x => x
             .AllowAnyOrigin()
             .AllowAnyMethod()
             .AllowAnyHeader()
             .AllowCredentials());

            app.UseMvc();
        }
    }

Если в файле запуска я удаляю строки

services.Configure<ApiBehaviorOptions>(options =>
            {
                options.SuppressConsumesConstraintForFormFileParameters = true;
                options.SuppressInferBindingSourcesForParameters = true;
                options.SuppressModelStateInvalidFilter = true;
            });

Действие никогда не выполняется, и я получаю ошибку http 400 неверного запроса

...