런타임에서 검색 한 하위 클래스에 UpdateModel 메서드를 사용하려고합니다. 누군가가 전체 해시를 만들고 있는지 여부를 밝힐 수 있다면 좋을 것입니다./또는 내가하려는 일이 가능한지 여부.MVC UpdateModel 및 하위 클래스 대 기본 클래스
나는 일반적인 동작을 사용하여 여러 부분 뷰의 유효성을 제어합니다. 나는 부분적인 관찰마다 특정한 행동을하는 것을 피하려고 노력하고있다.
각 부분보기는 기본 모델에서 파생 된 고유 한 모델이있다 : I는 제출 된 폼 요소와 값을 얻기 위해 작업에 FormCollection를 사용하고
public class ModelA : ModelBase{
[Required]
public string SomeStringProperty{get;set;}
...
}
public class ModelB : ModelBase{
[Required]
public DateTime? SomeDateProperty{get;set;}
...
}
public class ModelBase{
public Guid InstanceId{get;set;}
}
을,이 모델의 유형을 포함 뷰가 그 요구를 검증하기 위해서 사용하고있을 필요가 있습니다. 이 예를 들어이의 보안 문제를 무시 , 나는 그들을 알고 있어요,이 개념
[HttpPost]
public ActionResult ChangeCaseState(int id, FormCollection formCollection)
{
Guid instanceId = new Guid(formCollection["instanceId"]);
string modelType = formCollection["modelType"];
//Return a specific Model class based on the event/modelType
var args = GetStateModelClass(modelType, instanceId);
try
{
UpdateModel(args);
if(Model.IsValid){
...
}
catch (Exception)
{
return View("~/Views/Shared/StateForms/" + modelType + ".ascx", args);
}...
을의 내부에만 증거입니다 그리고 여기가 기준으로 하위 클래스를 반환하기 위해 사용하고 코드입니다 컨트롤러에 건네받는 modelType
private static ModelBase StateModelClassFactory(string stateModelTypeName, Guid instanceId)
{
switch (stateModelTypeName)
{
case "modelTypeA":
return new ModelA(workflowInstanceId);
case "modelTypeB":
return new ModelB(workflowInstanceId);
...
}
StateModelClassFactory 메서드의 반환 형식이 실제로 하위 클래스를 반환하고있어, 비록 기본 클래스의 때문에
은 UpdateModel 방법에 의해 사용되는 모델 바인더는 기본 클래스 내의 값에 바인딩합니다.이 문제를 해결할 수있는 방법에 대한 아이디어가 있습니까?
업데이트 : 내가 만든
고객 모델 바인더 :
public class CustomModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
그리고 후드 조금 더 무슨 일이 있었는지 확인하기 위해 올바른 기본 클래스에 새로운 모델 바인더를 할당 :
ModelBinders.Binders.Add(typeof(ModelBase), new CaseController.CustomModelBinder());
모델 바인더를 디버그하고 bindingContext를 검사 할 때 Model 속성이 올바른 Sub Class이지만 ModelType 속성은 기본 클래스의 속성입니다. BindModel 메서드 내에서 ModelType을 변경해야할까요? 이렇게하는 방법에 대한 포인터가 있으면 ModelType의 setter가 중복 된 것처럼 보입니다. 서브 클래스의 SomeDateProperty가 PropertyMetadata 속성에서 actaully 인 것으로 나타났습니다 .... 내가 원했던 것처럼 행동하는 것처럼 보입니다.
+1. 솔루션을 공유해 주셔서 감사합니다. –