[英]How do I migrate my code from .Net Framework to .Net Core 3.1?
[英]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.