我曾嘗試分離 DAL 并將其注入到 Program.cs 中的 DI 中,如下所示
services.AddScoped<IDataLoadServices, DataLoadServices>();
然后從資料庫獲取資料并將其放入模型(也許可以稱之為 ViewModel)我需要從模型類的建構式中獲取這些服務,如下所示
class MyModel{
public IList Countries{get;set;}
public int SelectedCountryCode{get;set;
//default Ctor
//call When creating by Model Binding
public MyModel(){
}
//call when creating by Factory
[ActivatorUtilitiesConstructor]
public MyModel(IDataLoadServices ser){
Countries = ser.LoadMyListFromDB();
}
}
在 Controller Action 中,我可以在成功傳遞給 View 之后使用 FactoryServices.(此處未顯示)創建一個 MyModel 實體。
@model MyModel
<form method="post" asp-controller="MyController">
...
<select asp-for="SelectedCountryCode" asp-items="@(new SelectList(Model.Countries, "CountryCode", "CountryName"))">
</select>
<input type="hidden" asp-for="SelectedCountryCode" />
...
在提交后的控制器操作中
[HttpsPost]
public IActionResult Submited(MyModel model){
//model.Countries == null
//model.SelectedCountryCode == 0 ????
}
我認為 MyModel 的問題是在具有默認建構式的模型系結階段創建的,因此它無法獲取國家/地區串列并且以某種方式無法決議 SelectedCountryCode。
- 那正確嗎 ?
- 繞過這個問題的任何想法?
uj5u.com熱心網友回復:
您的視圖顯示的大部分資料應該從控制器傳入。我會盡可能保持模型裸露。相反,將 注入IDataLoadServices控制器。
public class WorldController : Controller
{
private readonly IDataLoadServices _service;
public WorldController(IDataLoadServices service)
{
_service = service
}
}
查看關于此的檔案。ASP.NET Core 中控制器的依賴注入
uj5u.com熱心網友回復:
那正確嗎 ?--> 可能是,但您可以從模型中洗掉該默認建構式。因為它將默認創建。
繞過這個問題的任何想法?--> 有很多方法可以做到這一點。
- 您可以使用選項模式在 startup.cs 類中加載國家串列(假設您有一個帶有國家代碼和國家名稱的類),然后在模型建構式中使用該類。期權模式
- 在控制器類建構式中注入 IDataLoadServices。
uj5u.com熱心網友回復:
沒錯 --> ModelBinding 創建新的 MyModel 使用默認的建構式
這不應該成為問題。我在 Control Action 中收到的 MyModel 實體應該有 SelectedCountryCode != 0。=> 我在 Mapping 類中失敗了。
[HttpsPost] public IActionResult Submited(MyModel model){ //model.Countries == null => ok. because cant resolve IDataLoadServices //model.SelectedCountryCode != 0 }
如果有人需要 ModelBining 呼叫引數 Ctor:
創建 Factory 以將 DI 注入 Modelctor。
public class FactoryServices : IFactoryServices { private readonly IServiceProvider _sp; public FactoryServices(IServiceProvider serviceProvider) { _sp = serviceProvider; } public T Create<T>(params object[] p) { return ActivatorUtilities.CreateInstance<T>(_sp, p); } }創建自定義活頁夾
創建自定義 BinderProvider
注冊 DI
對于 1., 3., 4. 參考這個答案
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/375273.html
