문제

MVC가 Method(Action)를 호출하고 Model Binder를 사용하여 NamedValueCollection을 해당 메서드의 매개 변수에 매핑하는 방법과 비슷한 것을 만들어야 합니다.기본적으로 클래스에서 메서드를 동적으로 호출해야 하는 컨트롤러 작업이 있습니다. 컨트롤러에는 양식이나 쿼리 문자열로 전송된 정보와 문자열로 호출할 메서드 이름이 포함되어 있습니다.

내가 아는 한 이는 작업을 호출하는 것과 같습니다.나는 본질적으로 그것을 다른 수준으로 전달하고 있습니다(컨트롤러에서 이러한 메서드를 사용할 수 없는 데에는 그럴 만한 이유가 있습니다).

ASP.Net MVC 1.0 소스를 다운로드했지만 클래스가 너무 많아 이를 처리하는 코드를 찾는 데 어려움을 겪고 있습니다.

문자열에 이름이 포함된 메서드를 호출하는 방법을 알고 있지만 MVC에서 사용하는 더 좋은 방법이 있을 수도 있습니다.또한 모델 바인더를 사용하여 해당 메소드 매개변수에 대한 Request.Form + 쿼리 문자열을 만드는 방법도 알아야 합니다.

누구든지 이 작업을 수행하는 MVC 소스의 코드를 알려주거나 MVC에서 기본 모델 바인더를 수동으로 사용하는 것과 관련하여 올바른 방향을 알려줄 수 있다면 감사하겠습니다.

이것을 더 명확하게 할 수 있는지 알려주세요.

감사해요

도움이 되었습니까?

해결책

복잡해요.FindAction은 ControllerActionInvoker에서 호출됩니다.이는 결국 ReflectedControllerDescriptor.FindAction을 호출하고, 이는 다시 동일한 유형의 RunSelectionFilters를 호출하는 ActionMethodSelector.FindActionMethod를 호출합니다.해당 메서드는 칼라가 전달한 메서드 목록을 가져와 이를 반복하면서 각 메서드의 인수를 검사하고 요청의 값과 비교합니다.이는 요청이 들어올 때 빠르게 실행되어야 하기 때문에 모두 캐시되며 확장 가능하도록 설계되었기 때문에 제가 설명한 레이어 사이에 몇 가지 추상 유형이 있습니다.따라서 처음에는 따라가기가 약간 어려울 수 있으며 컨트롤러가 아닌 로직에 맞게 용도를 변경하는 것도 어려울 수 있습니다.그러나 이를 자신의 시스템을 구현하기 위한 모델로 사용할 수 있습니다.도메인별 애플리케이션에는 너무 복잡하다고 생각합니다.확장 지점의 수는 MVC 프레임워크에 적합할 수 있지만 자체 코드인 YAGNI에는 적합합니다.

그러나 이것이 시작하기에 충분하기를 바랍니다.

웹 스택 없이 모델 바인더를 사용하는 경우:음, 여전히 MVC가 필요하지만 반드시 웹 서버가 필요한 것은 아닙니다.단위 테스트에서 이를 수행하는 방법은 다음과 같습니다.

    internal static T Bind<T>(string prefix, FormCollection collection, ModelStateDictionary modelState) where T:BaseTimeRecordPresentationModel
    {
        var mbc = new ModelBindingContext()
        {
            ModelName = prefix,
            ModelState = modelState,
            ModelType = typeof(T),
            ValueProvider = collection.ToValueProvider()
        };
        IModelBinder binder = new TimeRecordModelBinder();
        var cc = new ControllerContext();

        return binder.BindModel(cc, mbc) as T;
    }

    internal static T BindAndAssertValid<T>(string prefix, FormCollection collection) where T:BaseTimeRecordPresentationModel
    {
        var msd = new ModelStateDictionary();
        var result = Bind<T>(prefix, collection, msd);
        if (!msd.IsValid)
        {
            Assert.Fail(ModelStateValidationSummary(msd));
        }
        return result;
    }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top