추상 클래스가 컨트롤러의 작업에서 매개 변수가 될 수 있습니까?
컨트롤러 내부에 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()));
}
프레임워크는 사용자가 어떤 구체적인 구현을 원하는지 알 수 있는 방법이 없으며, 그러한 결정에 대한 책임도 지지 않습니다.여기에는 두 가지 가능성이 있습니다.
- 작업 매개변수로 콘크리트 유형 사용
- 일부 요청 매개변수에 따라 특정 인스턴스를 반환하는 이 추상 클래스에 대한 사용자 정의 모델 바인더를 작성합니다.
추상 클래스의 하위 클래스를 생성하고 대신 통과해야 합니다.추상 클래스는 기본적으로 자체 인스턴스화가 허용되지 않습니다.그러나 다음과 같은 C# 메서드가 있는 경우:
protected void Foo(MyAbstractClass param1)
에게 My Class에서 할 수 내 추상 클래스에서 파생된 유형의 사례를 Foo에게 전달할 수 있습니다.동을들다수인다수aedo서e들usn을은인동MyChildClass : MyAbstractClass
당신의 방법으로 전달하면 여전히 효과가 있을 겁니다변경할 필요가 없습니다.Foo
method,이 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
'programing' 카테고리의 다른 글
동일한 페이지에 리액트 루트(수백 개)가 여러 개일 경우 성능 문제가 발생합니까? (0) | 2023.09.16 |
---|---|
Oracle: 시퀀스에 대해 어떤 권한을 부여해야 합니까? (0) | 2023.09.16 |
PL/SQL에 MD5 Sum 기능이 있습니까? (0) | 2023.09.16 |
C 질문: (공백 *) vs (공백 *) (0) | 2023.09.16 |
여러 비동기 작업을 동시에 실행할 수 있습니까? (0) | 2023.09.16 |