programing

추상 클래스가 컨트롤러의 작업에서 매개 변수가 될 수 있습니까?

megabox 2023. 9. 16. 08:54
반응형

추상 클래스가 컨트롤러의 작업에서 매개 변수가 될 수 있습니까?

컨트롤러 내부에 AJAX와 함께 호출되는 Action 기능이 있습니다.해당 Action은 1개의 파라미터를 사용하고 있습니다.클라이언트 측에서는 JSON 객체를 구성하는데, JSON 객체는 그 1개의 파라미터로 직렬화되어야 합니다.제가 부딪힌 문제는 파라미터 클래스가 추상적으로 선언되었다는 것입니다.따라서 인스턴스화할 수 없습니다.

AJAX가 해당 Action을 누르면 다음을 얻을 수 있습니다.

추상 클래스를 만들 수 없습니다.

추적 쌓기:

[MethodException 누락: 추상 클래스를 만들 수 없습니다.]
시스템.런타임핸들을 입력합니다.인스턴스 생성(실행 시간)유형 유형, Boolean publicOnly, Boolean noCheck, Boolean&canCached, Runtime메소드 핸들 내부&ctor, Boolean&bNeedSecurity체크) +0
시스템.런타임 유형.인스턴스 생성 속도가 느림(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache) +98
시스템.런타임 유형.인스턴스(Instance)DefaultCctor 생성(Boolean publicOnly, Boolean skipVisibility)Checks, Boolean skipCheckThis, Boolean fillCache) +241 시스템.액티베이터.인스턴스 생성(유형, 부울 비공용) +69 ...................

다른 매개 변수 객체를 생성하거나, 매개 변수 객체를 추상적으로 "선언 해제"하거나, MVC의 역학을 파헤치지 않고 그러한 시나리오를 수행할 수 있는 방법이 있습니까?

갱신하다

저는 현재 백엔드 개발자들과 함께 오브젝트를 조정하는 작업을 진행하고 있습니다.어느 쪽이든, 그것이 궁극적인 해결책이 될 것 같습니다.답변해 주셔서 감사합니다.

업데이트: 예제에서 이제 AJAX JSON POST를 사용합니다.

추상 유형을 사용해야 하는 경우 사용자 정의 모델 바인더를 제공하여 구체 인스턴스를 만들 수 있습니다.아래에 예시가 나와 있습니다.

모델 / 모델 바인더

public abstract class Student
{
    public abstract int Age { get; set; }
    public abstract string Name { get; set; }
}
public class GoodStudent : Student
{
    public override int Age { get; set; }
    public override string Name { get; set; }
}
public class BadStudent : Student
{
    public override int Age { get; set; }
    public override string Name { get; set; }
}
public class StudentBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var values = (ValueProviderCollection) bindingContext.ValueProvider;
        var age = (int) values.GetValue("Age").ConvertTo(typeof (int));
        var name = (string) values.GetValue("Name").ConvertTo(typeof(string));
        return age > 10 ? (Student) new GoodStudent { Age = age, Name = name } : new BadStudent { Age = age, Name = name };
    }
}

컨트롤러 작업

public ActionResult Index()
{
    return View(new GoodStudent { Age = 13, Name = "John Smith" });
}
[HttpPost]
public ActionResult Index(Student student)
{
    return View(student);
}

보다

@model AbstractTest.Models.Student

@using (Html.BeginForm())
{
    <div id="StudentEditor">
        <p>Age @Html.TextBoxFor(m => m.Age)</p>
        <p>Name @Html.TextBoxFor(m => m.Name)</p>
        <p><input type="button" value="Save" id="Save" /></p>
    </div>
}

<script type="text/javascript">
    $('document').ready(function () {
        $('input#Save').click(function () {
            $.ajax({
                url: '@Ajax.JavaScriptStringEncode(Url.Action("Index"))',
                type: 'POST',
                data: GetStudentJsonData($('div#StudentEditor')),
                contentType: 'application/json; charset=utf-8',
                success: function (data, status, jqxhr) { window.location.href = '@Url.Action("Index")'; }
            });
        });
    });

    var GetStudentJsonData = function ($container) {
             return JSON.stringify({
                 'Age': $container.find('input#Age').attr('value'),
                 'Name': $container.find('input#Name').attr('value')
             });
         };
</script>

Global.asax.cs 에 추가됨

protected void Application_Start()
{
    ...
    ModelBinders.Binders.Add(new KeyValuePair<Type, IModelBinder>(typeof(Student), new StudentBinder()));
}

프레임워크는 사용자가 어떤 구체적인 구현을 원하는지 알 수 있는 방법이 없으며, 그러한 결정에 대한 책임도 지지 않습니다.여기에는 두 가지 가능성이 있습니다.

  1. 작업 매개변수로 콘크리트 유형 사용
  2. 일부 요청 매개변수에 따라 특정 인스턴스를 반환하는 이 추상 클래스에 대한 사용자 정의 모델 바인더를 작성합니다.

추상 클래스의 하위 클래스를 생성하고 대신 통과해야 합니다.추상 클래스는 기본적으로 자체 인스턴스화가 허용되지 않습니다.그러나 다음과 같은 C# 메서드가 있는 경우:

protected void Foo(MyAbstractClass param1)

에게 My Class에서 할 수 내 추상 클래스에서 파생된 유형의 사례를 Foo에게 전달할 수 있습니다.동을들다수인다수aedo서e들usn을은인동MyChildClass : MyAbstractClass당신의 방법으로 전달하면 여전히 효과가 있을 겁니다변경할 필요가 없습니다.Foomethod,이 method를 만들 수 C#할 것입니다. 그래서 은 method, C#에한이할은다이수들고은d수d,,들이만ocoteldMyChildClass.

제네릭을 사용하는 경우 -- 예를 들어 메소드 서명이 다음과 같은 경우:

protected void Foo(IEnumerable<MyAbstractClass> param1)

...그러면 일이 더 복잡해지고, C# 제네릭의 공분산과 모순에 대해 알아봐야 할 것입니다.

컨트롤러에 액세스할 수 있는 경우 멤버를 지정하지 않고 추상 클래스를 상속하는 다른 클래스를 추가하여 병렬화를 직렬화한 후 다른 계층으로 기본을 반환할 수 있습니까?

이것이 좋은 연습이 아니라는 것을 알지만 약간의 해킹이지만 추상적인 수업이 어떤 식으로든 연재될 수 있을지 모르겠습니다.

아니오 - JSON을 추상 클래스의 개체로 병렬화하려는 시도는 의미가 없습니다.제대로 된 수업이 될 수는 없나요?

언급URL : https://stackoverflow.com/questions/5861241/can-abstract-class-be-a-parameter-in-a-controllers-action

반응형