Пользовательская модель переплетC#

Место общения программистов C#
Ответить
Anonymous
 Пользовательская модель переплет

Сообщение 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);
}
}


Подробнее здесь: https://stackoverflow.com/questions/797 ... ad-request
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»