SORU
28 AĞUSTOS 2011, Pazar


Polimorfik model bağlama

Bu soruyu MVC önceki sürümlerinde asked before olmuştur. Ayrıca, bu soruna geçici bir çözüm bulmak için bir yol hakkında this blog entry var. Eğer MVC3 yardımcı olabilecek, ya da eğer başka bir seçenek varsa bir şey tanıttı, merak ediyorum.

Özetle. İşte durum. Soyut temel bir model var, ve 2 beton sınıfları. EditorForModel() ile modellerini oluşturan türü kesin belirlenmiş bir görünümü var. Her beton türü işlemek için özel şablonlar var.

Sorun sonrası dönemde geldi. Yaparsam post eylem yöntemi temel sınıf olarak parametre, daha sonra MVC olmaz oluşturun soyut bir versiyonu (ki ben istemez ki zaten, istiyorum, istemiyorum oluşturun gerçek somut tip). Eğer parametre imza sadece değişen birden fazla post eylem yöntemleri oluşturmak, daha sonra MVC belirsiz olduğundan yakınıyor.

Söyleyebileceğim kadarıyla, bu proble çözmek için nasıl bir kaç seçenek var. Çeşitli nedenlerle hiçbirini sevmem, ama onları burada listelenir:

  1. Darin ilk yazı için ben bağlantılı anlaşılacağı gibi özel model bir cilt oluşturun.
  2. Anlaşılacağı üzere ben bağlantılı ikinci post olarak elde edilir bir öznitelik oluşturun.
  3. Farklı eylem yöntemleri türüne bağlı yazı
  4. ???

1, çünkü gizli temelde yapılandırma olduğunu sanmıyorum. Başka bir geliştirici kodu üzerinde çalıştığını biliyor ve çok zaman atık zaman işler değişir şeylerin sonu neden anlamaya çalışıyorum olmayabilir.

Biraz hacky görünüyor çünkü 2, sevmiyorum. Ama, bu yaklaşım doğru eğilerek değilim.

3, KURU ihlal anlamına geldiğini, çünkü sevmiyorum.

Başka bir öneriniz var mı?

Düzenleme:

Darin yöntemi ile gitmeye karar verdim, ama ufak bir değişiklik yaptı. Soyut benim için bu modeli ekledim:

[HiddenInput(DisplayValue = false)]
public string ConcreteModelType { get { return this.GetType().ToString(); }}

Sonra bir gizli otomatik olarak benim DisplayForModel() oluşturulan alır. Hatırlamanız gereken tek şey ise DisplayForModel(), kullanıyorsun yoksa Kendin eklemek zorundasın.

CEVAP
28 AĞUSTOS 2011, Pazar


Açıkçası seçenek 1 tercih beri (:-)) ben daha az o kadar . biraz daha ayrıntılı anlatmaya çalışayım ^em>kırılabilirve model Ciltçi somut örnekleri hardcoding kaçının. Fikri gizli bir alana beton türü geçiş ve yansıma beton türü oluşturmak için kullanmaktır.

Aşağıdaki görünüm modelleri olduğunu varsayalım:

public abstract class BaseViewModel
{
    public int Id { get; set; }
}

public class FooViewModel : BaseViewModel
{
    public string Foo { get; set; }
}

aşağıdaki denetleyicisi:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var model = new FooViewModel { Id = 1, Foo = "foo" };
        return View(model);
    }

    [HttpPost]
    public ActionResult Index(BaseViewModel model)
    {
        return View(model);
    }
}

Index karşılık gelen görünümü:

@model BaseViewModel
@using (Html.BeginForm())
{
    @Html.Hidden("ModelType", Model.GetType())    
    @Html.EditorForModel()
    <input type="submit" value="OK" />
}

~/Views/Home/EditorTemplates/FooViewModel.cshtml editör şablonu:

@model FooViewModel
@Html.EditorFor(x => x.Id)
@Html.EditorFor(x => x.Foo)

Şimdi aşağıdaki özel model binder yapabiliriz:

public class BaseViewModelBinder : DefaultModelBinder
{
    protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType)
    {
        var typeValue = bindingContext.ValueProvider.GetValue("ModelType");
        var type = Type.GetType(
            (string)typeValue.ConvertTo(typeof(string)),
            true
        );
        if (!typeof(BaseViewModel).IsAssignableFrom(type))
        {
            throw new InvalidOperationException("Bad Type");
        }
        var model = Activator.CreateInstance(type);
        bindingContext.ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(() => model, type);
        return model;
    }
}

Gerçek türü ModelType gizli alanın değerini algılanır. Diğer alt türleri daha sonra hiç bu model binder dokunmadan ekleyebilirsiniz, yani kodlanmış değildir.

Bu aynı tekniği temel görünüm modelleri koleksiyonları için easily be applied olabilir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Andrey Menshikov

    Andrey Mensh

    28 Ocak 2012
  • DRDAnimation

    DRDAnimation

    28 EYLÜL 2012
  • Ryan Ha

    Ryan Ha

    9 NİSAN 2006