UpdateModelメソッドを実行時に取得されたサブクラスに使用すると、誰かが私がそれをトータルハッシュしているかどうか、 /または私がしようとしていることが可能かどうか。MVC UpdateModelとサブクラスvsベースクラス
私は、部分的なビューの束の検証を制御するために一般的なアクションを使用しています。私は、部分的な見方ごとに特定の行動をとることをやめようとしています。
各部分図には、ベースモデルから派生した独自のモデルを持っています
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;}
}
私が提出したフォーム要素とその値を取得するためにアクションにFormCollectionを使用しています、これはモデルのタイプを含みViewがリクエストを検証するために使用する必要があることを示します。 この例では、このによるセキュリティへの影響を無視し、私は彼らの意識だと、これは
[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メソッドが使用するモデルバインダーは基本クラス内の値に対してバインドします。
どのように私はこの問題を解決することができますか?
UPDATE:
public class CustomModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
そして、ボンネットの下に、もう少しで何が起こっていたか確認するために、正しい基本クラスに新しいモデルバインダーを割り当て:
私は、お客様のモデルバインダーを作成しました:
ModelBinders.Binders.Add(typeof(ModelBase), new CaseController.CustomModelBinder());
モデルバインダーをデバッグしてbindingContextを検査すると、Modelプロパティは正しいサブクラスですが、ModelTypeプロパティはベースクラスのプロパティです。 BindModelメソッド内でModelTypeを変更することを検討する必要がありますか?これを行う方法の指針があれば、ModelTypeのセッターは冗長化されているようです。私はまた、サブクラスのSomeDatePropertyがPropertyMetadataプロパティでactaullyであることに気付きました....私が望むように動作するように見えます。
+1。あなたのソリューションを共有していただきありがとうございます。 –