Как перенести код динамического связывания в MVC из .NET Framework в .NET Core? - PullRequest
0 голосов
/ 10 июня 2019

Мне было поручено преобразовать некоторый код, который есть в MVC, из .NET Framework в .NET Core.Код динамически связывает View с соответствующей моделью на основе простого шаблона.Имя представления - это первое поле на странице, которое передается.Например, если первое поле данных - PAGE1, то существует соответствующая Модель с именем PAGE1Model.Код выполняет динамическое связывание с использованием ModelBindingContext ().Этот код прекрасно работает в .NET Framework, но синтаксис в .NET Core.

Я попытался написать то, что, по моему мнению, будет эквивалентно .NET Core.Он компилируется, но не работает.Насколько я понимаю, на поверхности связывание в .NET Core и Framework дает одинаковые результаты, но внутри они разные, и я думаю, что именно это вызывает проблему.Так как я новичок в .NET Core, я потратил 3 дня на поиск кода, который будет динамически назначать модель для Binder, но каждый пример, который я могу найти, динамически меняет что-то внутри View или Model, но предполагает, что сами View и Model являютсяфиксированныйМоя единственная попытка .NET Core, которая не работает, -

public class ModelBinder : IModelBinder
{
    public ModelBinder(MapModel pModel, ControllerContext pContext)
    {
        model = pModel;
        context = pContext;
    }
    MapModel model;
    ControllerContext context;
    private readonly IModelBinder thisBinder;
    public Task BindModelAsync(ModelBindingContext bindingContext)
    {
        if (bindingContext == null)
        {
            throw new ArgumentNullException(nameof(bindingContext));
        }
        bindingContext.Model = model;
        bindingContext.ValueProvider = (IValueProvider) context;
        return Task.CompletedTask;
    }
}

, а новый вызов -

ModelBinder BindModel = new ModelBinder(Model, this.ControllerContext);

Я ожидал, что это выполнит то же самое, что и .NETКод платформы, но он ничего не делает, потому что задача BindModelAsync никогда не запускается.

Приложение является устаревшим приложением, перенесенным в C # .NET из мейнфрейма COBOL, поэтому я ограничен в том, что не могу изменитьформат ввода или соответствие между именем вида и названием модели.

Ответы [ 2 ]

2 голосов
/ 14 июня 2019

Принятый ответ переписан, чтобы быть неблокирующим в современном синтаксисе C #

public async Task<IActionResult> Action() {
    // ...
    if (ModelState.IsValid)
    {
        var result = await TryUpdateModelAsync(Model, Model.GetType(), "");
        if (!result)
           throw new Exception("TxServerController.TxMap: TryUpdateModelAsync failed");
    }
    ModelState.Clear();
}
0 голосов
/ 13 июня 2019

Для всех, у кого есть подобная проблема, вот код, который я придумал, который действительно работает:

if (this.ModelState.IsValid)
            {
                Task<bool> task = this.TryUpdateModelAsync(Model, Model.GetType(), "");
                task.Wait();
                if (!task.Result)
                    throw new Exception("TxServerController.TxMap: TryUpdateModelAsync failed");
            }
            this.ModelState.Clear();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...