2013-05-10 17 views
33
@model Customer 

@Html.Partial("_UserProfile", (UserProfile)Model.UserProfile) 

ben bu kodu çalıştırdığınızda, ben bu hatayı alıyorum:(PartialView) modeli öğesi 'Müşteri' tiptedir, ancak bu sözlüğü tip bir modeli madde gerektirir 'UserProfile'

The model item passed into the dictionary is of type 'Customer', but this dictionary requires a model item of type 'UserProfile'. 

Kısmi Görünüm _UserProfile yazılmıştır.

Bu alanı düzenleyebilmek istiyorum. Herhangi bir öneriniz var mı?

+0

Ayrıca Html.Action ve Html.Partial arasındaki farkları kontrol edin https://stackoverflow.com/questions/16886585/html-partial-skips-the-controller-action –

cevap

72

Model.UserProfile öğenizin boş olmadığından emin olun.

Yayınınızı aynı hatayı ayıklamaya çalışırken buldum ve "Model.UserProfile" eşdeğerini başlatmamıştım.

Burada neler olup bittiğini tahmin ediyorum, boş bir model RenderPartial'e geçerse ana görünümün modelini kullanmak varsayılan mıdır? Bunu onaylayan var mı?

+18

Haklısınız. Bu bir aşırı yükleme sorunudur. Modeli 'null' olarak geçerken '@ Html.Partial (, ) 'aramayı denediğinizde, uygulama yalnızca görünümün adını kabul eden ve geçerli görünüm modelini geçiren yöntem sürümünü çağırdığınızı varsayar. kısmi görünüm. – Lafi

+0

Evet, haklısınız! Çoğu durumda bunu düzeltmek için ViewModel Constructor'ınızda PropertyThatWasNull = new YourObject() öğesini ekleyebilirsiniz. Boş bir UserProfile nesnesiyle daha zor olabilir. – jwize

+1

MVC'deki iğrenç bir böcek, sadece tarafından da vuruldu, bahşiş için teşekkürler. – Alejandro

-1

Bir Customer türündeki nesneye UserProfile türündeki bir nesneyi göndermeye çalışıyorsunuz. Varsayılan olarak, bu çerçeve, bu nesnelere nasıl yazılacağı konusunda hiçbir fikre sahip olmadığı için işe yaramaz.

public static explicit operator Digit(byte b) // explicit byte to digit conversion operator 
{ 
    Digit d = new Digit(b); // explicit conversion 

    System.Console.WriteLine("Conversion occurred."); 
    return d; 
} 

Bunun here hakkında daha fazla bilgi edinebilirsiniz: kesinlikle bu şekilde yapmak gerekiyorsa tek seçenek gibi açık döküm operatörü sağlamaktır.

+0

UserProfile özelliği için bir döküm var. Bu durumda gereksiz olması gerektiğini düşünüyorum ama derleyiciye bunu aktardığım türden olduğunu söylemeye yönelik açık bir girişime benziyor. – avantprime

-1

"Sanal" anahtar kelimesini Müşteri modelindeki UserProfile özelliğine ekleyin. Bu easyest yolu tembel yükleme, ancak performansı ..

18

Model.UserProfile boş ise, müşteri modeline geçmek dener üstesinden olduğunu. Bunu aşmanın

iki yolu:

@model Customer 

@Html.Partial("_UserProfile", (UserProfile)Model.UserProfile, new ViewDataDictionary()) 

Veya:

@model Customer 

if (Model.UserProfile != null) 
{ 
    @Html.Partial("_UserProfile", (UserProfile)Model.UserProfile) 
} 
+0

İkincisi işe yaramaz, savunma kalıbı kullanmanız gerekir: '@ Html.Partial (" _ UserProfile ", UserProfile olarak model)" – Echilon

+0

@Echilon: Doğru değil, ikincisi işe yaramıyor, ama senin önerin. Cevaptaki ilk seçenek sorunu çözüyor. – musefan

+0

İkincisi, model boşsa kısmi görünümü atlamak için tasarlanmıştır. Bu örnekte, kullanıcı profili olmadığında bir UserProfile görünümünü görüntülemek yararlı olmayabilir ve bu hatadan kaçınacaktır. – Kcoder

0

geçirilen madde boş olup olmadığı ilk modeline son çare olacaktır.

bu deneyin: * Ad ve Adres kayıtları gibi bir kullanıcı profilinin parçaları ile uğraşırken

@Html.Partial("_UserProfile", (UserProfile)Model.UserProfile ?? new UserProfile()) 
1

bu sorunla karşılaştık. Kullanıcının tamamlanmamış bir profili varsa, hesap yönetimi görünümünün boş bir Adres kaydını algılamasını ve yeni bir Adres oluşturmak için bir Eylem bağlantısı görüntülemesini veya mevcut herhangi bir adres verisini görüntülemesini istiyorum.

Başkaları tarafından açıklandığı gibi, null geçtiğinde Html için aşırı yük aktarılır.RenderPartial tetiklenir ve Üst Görünüm Modeli geçer. Kısmi görünümlerimi, etrafından dolaşmak için Ekran ve Editör Şablonlarına dönüştürmeyi bitirdim.Hansleman ve

codeguru Bu yöntemle daha iyi yeniden kullanılabilirlik almak ve boş değerler korur: İşte bazı Nasıl Yapılır makaleleri vardır sizin Görünüm olarak :

@Html.DisplayFor(m=> m.Address) 

Sonra null değerini ele DisplayTemplate.

@model Namespace.Models.MyObject 
... 
if(@Model != null){ 
... 
}else{ 
... 
} 
+1

Bu problemin kendi versiyonunu çözmeye çalıştığımız tüm yöntemlerden, bu en iyisiydi. ViewData ve ModelState (ModelState hataları dahil) tümü bununla normal şekilde iletilir. Diğer çözümlerin çoğu, herhangi bir ModelState'i vidalayan yeni bir ViewData nesnesi geçirir. – mikeschuld

+0

Tam olarak @mikeschuld Neden aslında modeliniz boş olduğunda, hata işleme ve yeni bir nesne atmak istersiniz? Sadece ele alınması gereken durumu halledin. Adalet içinde nasıl Html.Partial nasıl kullanılacağı sorusuna cevap vermedim sadece söyledim eğer nesneniz boş olamazsa kullanmayın. – reachingnexus

0

Aynı problemle karşılaştım ama sonunda anladım. Geçilen modellerde bir tür uyuşmazlığı vardır. Görünümünüz, Customer modelini kabul eder, ancak kısmi görünüm, Userprofile modelini geçirirsiniz, böylece yapmanız gereken şey, aynı modeli, her ikisinde de geçirmektir. her iki modelin tüm özellikleri. Elbette sorunun çözülecek.