Я создал пользовательскую модель связующего, потому что в качестве изменения версии в моей модели мне нужны чистые данные, чтобы привязаться к определенному типу, который относится к этой версии. Пользовательская модель Binder доходит до точки, когда он устанавливает успех, а модель устанавливает True, как будто оно никогда не попадает в действие контроллера, потому что я не могу наблюдать за действием. Кроме того, ответ показывает: < /p>
errors: {}
status: 400
title: "One or more validation errors occurred."
traceId: "00-84af1f3a67fd9628cedf2d09ae2208b9-16f84be80cb8d91a-00"
type: "https://tools.ietf.org/html/rfc9110#section-15.5.1"
< /code>
Итак, мои модели следующие: < /p>
[ModelBinder(BinderType = typeof(AddCleanPreprintDataModelBinder))]
public class AddCleanPreprintDataDTO
{
public int DmcpTabId { get; set; }
public int Version { get; set; }
public object CleanData { get; set; }
}
public class Version1PreprintCleanData
{
public List Programs { get; set; }
public DateTime RatingPeriodStart { get; set; }
public DateTime RatingPeriodEnd { get; set; }
public int TotalDollarAmount { get; set; }
public List VbpType { get; set; }
public List SdpType { get; set; }
public PreprintFieldMapping HowIncluded { get; set; }
public string? HowIncludedOther { get; set; }
public List FundingSource { get; set; }
public string? FundingSourceOther { get; set; }
public int? IgtTransferAmount { get; set; }
}
public class PreprintFieldMapping
{
public int Id { get; set; }
public string? CleanValue { get; set; }
public string? RawValue { get; set; }
}
< /code>
Мое связывание следующее: < /p>
using System.Text.Json;
using ARMS_API.SDP.Models;
using Microsoft.AspNetCore.Mvc.ModelBinding;
public class AddCleanPreprintDataModelBinder : IModelBinder
{
private readonly IModelBinderFactory _binderFactory;
private readonly IModelMetadataProvider _metadataProvider;
public AddCleanPreprintDataModelBinder(
IModelBinderFactory binderFactory,
IModelMetadataProvider metadataProvider)
{
_binderFactory = binderFactory;
_metadataProvider = metadataProvider;
}
public async Task BindModelAsync(ModelBindingContext bindingContext)
{
try
{
var valueProvider = bindingContext.ValueProvider;
// Step 1: Bind basic values (Version, DmcpTabId)
var versionValue = valueProvider.GetValue("version").FirstValue;
var dmcpTabIdValue = valueProvider.GetValue("dmcpTabId").FirstValue;
var dto = new AddCleanPreprintDataDTO
{
DmcpTabId = int.TryParse(dmcpTabIdValue, out var id) ? id : 0,
Version = int.TryParse(versionValue, out var version) ? version : 0
};
// Step 2: Determine the correct type based on Version
Type cleanDataType = GetCleanDataType(dto.Version);
if (cleanDataType != null)
{
// Step 3: Bind CleanData using framework infrastructure
var metadata = _metadataProvider.GetMetadataForType(cleanDataType);
var binder = _binderFactory.CreateBinder(new ModelBinderFactoryContext
{
Metadata = metadata,
BindingInfo = new BindingInfo(),
CacheToken = cleanDataType
});
var childContext = DefaultModelBindingContext.CreateBindingContext(
bindingContext.ActionContext,
valueProvider,
metadata,
bindingInfo: null,
modelName: "cleanData");
await binder.BindModelAsync(childContext);
if (childContext.Result.IsModelSet)
{
dto.CleanData = childContext.Result.Model;
}
}
var test = JsonSerializer.Serialize(dto);
bindingContext.Result = ModelBindingResult.Success(dto);
}
catch (Exception ex)
{
// Log the exception for debugging
bindingContext.ModelState.TryAddModelError("", $"Model binding failed: {ex.Message}");
bindingContext.Result = ModelBindingResult.Failed();
}
}
private Type GetCleanDataType(int version)
{
// Replace with real versioning logic
return version switch
{
1 => typeof(Version1PreprintCleanData),
_ => null
};
}
< /code>
} < /p>
Тогда мой контроллер заключается в следующем: < /p>
[HttpPost("dmcpTabId/{DmcpTabId}/cleanData")]
public async Task AddCleanPreprintData(AddCleanPreprintDataDTO addCleanPreprintData)
{
Console.WriteLine(ModelState);
try
{
var dto = await _documentsService.AddCleanPreprintDataAsync(addCleanPreprintData);
return Ok(new ResponseDTO()
{
Succeeded = true,
StatusCode = 200,
Message = "The files have been successfully uploaded.",
Data = dto,
Pagination = null
});
}
catch (Exception ex)
{
return StatusCode(400);
}
}
Подробнее здесь: https://stackoverflow.com/questions/797 ... ad-request
Пользовательская модель переплет ⇐ C#
Место общения программистов C#
1756397037
Anonymous
Я создал пользовательскую модель связующего, потому что в качестве изменения версии в моей модели мне нужны чистые данные, чтобы привязаться к определенному типу, который относится к этой версии. Пользовательская модель Binder доходит до точки, когда он устанавливает успех, а модель устанавливает True, как будто оно никогда не попадает в действие контроллера, потому что я не могу наблюдать за действием. Кроме того, ответ показывает: < /p>
errors: {}
status: 400
title: "One or more validation errors occurred."
traceId: "00-84af1f3a67fd9628cedf2d09ae2208b9-16f84be80cb8d91a-00"
type: "https://tools.ietf.org/html/rfc9110#section-15.5.1"
< /code>
Итак, мои модели следующие: < /p>
[ModelBinder(BinderType = typeof(AddCleanPreprintDataModelBinder))]
public class AddCleanPreprintDataDTO
{
public int DmcpTabId { get; set; }
public int Version { get; set; }
public object CleanData { get; set; }
}
public class Version1PreprintCleanData
{
public List Programs { get; set; }
public DateTime RatingPeriodStart { get; set; }
public DateTime RatingPeriodEnd { get; set; }
public int TotalDollarAmount { get; set; }
public List VbpType { get; set; }
public List SdpType { get; set; }
public PreprintFieldMapping HowIncluded { get; set; }
public string? HowIncludedOther { get; set; }
public List FundingSource { get; set; }
public string? FundingSourceOther { get; set; }
public int? IgtTransferAmount { get; set; }
}
public class PreprintFieldMapping
{
public int Id { get; set; }
public string? CleanValue { get; set; }
public string? RawValue { get; set; }
}
< /code>
Мое связывание следующее: < /p>
using System.Text.Json;
using ARMS_API.SDP.Models;
using Microsoft.AspNetCore.Mvc.ModelBinding;
public class AddCleanPreprintDataModelBinder : IModelBinder
{
private readonly IModelBinderFactory _binderFactory;
private readonly IModelMetadataProvider _metadataProvider;
public AddCleanPreprintDataModelBinder(
IModelBinderFactory binderFactory,
IModelMetadataProvider metadataProvider)
{
_binderFactory = binderFactory;
_metadataProvider = metadataProvider;
}
public async Task BindModelAsync(ModelBindingContext bindingContext)
{
try
{
var valueProvider = bindingContext.ValueProvider;
// Step 1: Bind basic values (Version, DmcpTabId)
var versionValue = valueProvider.GetValue("version").FirstValue;
var dmcpTabIdValue = valueProvider.GetValue("dmcpTabId").FirstValue;
var dto = new AddCleanPreprintDataDTO
{
DmcpTabId = int.TryParse(dmcpTabIdValue, out var id) ? id : 0,
Version = int.TryParse(versionValue, out var version) ? version : 0
};
// Step 2: Determine the correct type based on Version
Type cleanDataType = GetCleanDataType(dto.Version);
if (cleanDataType != null)
{
// Step 3: Bind CleanData using framework infrastructure
var metadata = _metadataProvider.GetMetadataForType(cleanDataType);
var binder = _binderFactory.CreateBinder(new ModelBinderFactoryContext
{
Metadata = metadata,
BindingInfo = new BindingInfo(),
CacheToken = cleanDataType
});
var childContext = DefaultModelBindingContext.CreateBindingContext(
bindingContext.ActionContext,
valueProvider,
metadata,
bindingInfo: null,
modelName: "cleanData");
await binder.BindModelAsync(childContext);
if (childContext.Result.IsModelSet)
{
dto.CleanData = childContext.Result.Model;
}
}
var test = JsonSerializer.Serialize(dto);
bindingContext.Result = ModelBindingResult.Success(dto);
}
catch (Exception ex)
{
// Log the exception for debugging
bindingContext.ModelState.TryAddModelError("", $"Model binding failed: {ex.Message}");
bindingContext.Result = ModelBindingResult.Failed();
}
}
private Type GetCleanDataType(int version)
{
// Replace with real versioning logic
return version switch
{
1 => typeof(Version1PreprintCleanData),
_ => null
};
}
< /code>
} < /p>
Тогда мой контроллер заключается в следующем: < /p>
[HttpPost("dmcpTabId/{DmcpTabId}/cleanData")]
public async Task AddCleanPreprintData(AddCleanPreprintDataDTO addCleanPreprintData)
{
Console.WriteLine(ModelState);
try
{
var dto = await _documentsService.AddCleanPreprintDataAsync(addCleanPreprintData);
return Ok(new ResponseDTO()
{
Succeeded = true,
StatusCode = 200,
Message = "The files have been successfully uploaded.",
Data = dto,
Pagination = null
});
}
catch (Exception ex)
{
return StatusCode(400);
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79749303/custom-model-binder-resulting-in-response-400-bad-request[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия