引言
水此篇博客,依舊是來自群里的討論,最后說到了,在方法參數(shù)自定義了一個特性,用來綁定模型,優(yōu)先從Form取,如果為空,或者不存在,在從QueryString中獲取并且綁定,然后閑著無聊,就水一篇博客,如果大家有什么需求或者問題,可以找我,很高興能為你們帶來幫助。
IModelBinderFactory
總共也沒有多少代碼,關鍵其實也就是在于三個接口而已。第一個接口就是模型綁定工廠接口,繼承這個接口,然后實現(xiàn)創(chuàng)建IModelBinder接口的實例即可,當然可以看到我們需要實現(xiàn)IModelBinder接口,在這個接口中,我們就new一個TestBinder就行了,只實現(xiàn)效果,不涉及業(yè)務,然后在綁定的時候會調用到BindModelAsync方法,然后在此處你可以實現(xiàn)自定義模型綁定,可以結合Required或者Email,MaxLength特性,結合HttpCotnext實現(xiàn)自己的一個模型綁定。
public class TestBinderFactory : IModelBinderFactory { public IModelBinder CreateBinder(ModelBinderFactoryContext context) { return new TestBinder(); } }
public class TestBinder : IModelBinder { public Task BindModelAsync(ModelBindingContext bindingContext) { bindingContext.Model = new TestModel() { }; bindingContext.Result = ModelBindingResult.Success(bindingContext.Model); return Task.CompletedTask; } }
IObjectModelValidator
在模型綁定之后,還需要實現(xiàn)自定義的一個驗證,在默認情況下,如果使用自己去驗證,且你綁定好的模型里有屬性為null,則會提示the propertyname is required,就是這個屬性是必須的,就需要在此處實現(xiàn)一個自定義驗證,讓通過驗證,如果有需要你還需要實現(xiàn)IValidationStrategy接口,用來對模型內部的各個子項屬性進行驗證,當然如果不需要驗證的話可以直接走默認的,即實現(xiàn)了這個接口,但不寫Validate的方法體,空方法就行,如果需要就自己實現(xiàn)就行了,同時將自己實現(xiàn)的接口注入到容器,替換掉自帶的就可以實現(xiàn)自定義模型綁定和驗證了。
public class Validator : IObjectModelValidator { public Validator(IModelMetadataProvider modelMetadataProvider) { ModelMetadataProvider = modelMetadataProvider; } public IModelMetadataProvider ModelMetadataProvider { get; } public void Validate(ActionContext actionContext, ValidationStateDictionary? validationState, string prefix, object? model) { //var data=ModelMetadataProvider.GetMetadataForType(model.GetType()); //var entry=new Microsoft.AspNetCore.Mvc.ModelBinding.Validation.ValidationStateEntry(); //entry.Key = "Name"; //entry.Metadata = data; //validationState.Add("Name", entry); } }
builder.Services.AddSingleton<IObjectModelValidator, Validator>();
builder.Services.AddSingleton<IModelBinderFactory, TestBinderFactory>();
結尾
本博客僅提供思路以及部分接口實現(xiàn),不涉及任何業(yè)務,如果在asp.net core中需要自定義實現(xiàn)什么,此處提供幾個思路,
1:去api瀏覽器,找到對應的相關接口,傳送門。
2:然后在啟動的時候,在service全部注入之后,打斷點,找到和你要實現(xiàn)自定義相關的接口或者實例即可。
3:根據(jù)第二步找到的相關注入類型,在api瀏覽器找到對應的,實現(xiàn)這個接口然后注入進去即可,源碼中所有的都是tryadd,所以不用擔心沖突,存在多種實現(xiàn)的也都是集合類型的。
4:接下來就是調試運行,就行了。
當然有能力者,可以直接去閱讀源碼實現(xiàn)即可,思路往往比具體的實現(xiàn)更重要。近期會在此處講解asp.net core啟動流程及其源碼,有興趣的話,可以進群。
?