簡體   English   中英

如何將MVC中的動態綁定代碼從.NET Framework遷移到.NET Core?

[英]How do I migrate dynamic binding code in MVC from .NET Framework to .NET Core?

我的任務是將MVC中的某些代碼從.NET Framework轉換為.NET Core。 該代碼根據一個簡單的模式將視圖動態綁定到適當的模型。 視圖名稱是傳輸頁面中的第一個字段。 例如,如果第一個數據字段是PAGE1,則存在一個名為PAGE1Model的相應模型。 該代碼通過使用ModelBindingContext()進行動態綁定。 該代碼可在.NET Framework中完美運行,但在.NET Core中可使用語法。

我嘗試編寫我認為與.NET Core相當的東西。 它可以編譯,但是不起作用。 據我了解,在.NET Core和Framework的表面綁定上產生的結果相同,但是在內部它們是不同的,我認為這就是問題所在。 由於我是.NET Core的新手,我花了3天的時間尋找一些代碼,這些代碼將為Model Binder動態分配模型,但是每個示例我都可以在View或Model中動態更改某些內容,但假定View和Model本身是固定。

這是在.NET Framework中起作用的代碼

private void BindModel(MapModel pModel)
    {
        Type ModelType = pModel.GetType();
        // bind model data
        var binder = Binders.GetBinder(ModelType);
        ModelBindingContext bindingContext = new ModelBindingContext()
        {
            ModelMetadata = 
              ModelMetadataProviders.Current.GetMetadataForType(() 
           => pModel, ModelType),
            ModelState = ModelState,
            ValueProvider = new FormValueProvider(this.ControllerContext)
        };
        binder.BindModel(ControllerContext, bindingContext);
    }

輸入是Map +“ Model”的名稱,例如BindModel(Map1Model)

我對.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 Framework代碼相同的操作,但是它沒有做任何事情,因為BindModelAsync任務從未運行過。

該應用程序是一個從大型機COBOL移到C#.NET的遺留應用程序,因此我受到約束,因為我無法更改輸入格式或視圖名稱與模型名稱之間的對應關系。

接受的答案在現代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();
}

為了使其他任何遇到類似問題的人都受益,這是我想出的代碼,它確實有效:

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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM