Parametreleri mvc 4'te kısmi görünüme nasıl aktarabilirim


152

Ben böyle bir bağlantı var:

 <a href='Member/MemberHome/Profile/Id'><span>Profile</span></a>

ve bunu tıkladığımda bu kısmi sayfayı çağırır:

 @{
    switch ((string)ViewBag.Details)
    {

        case "Profile":
        {
           @Html.Partial("_Profile"); break;
        }

    }
}

Kısmi sayfa _Profil şunları içerir:

Html.Action("Action", "Controller", model.Paramter) 

Misal:

@Html.Action("MemberProfile", "Member", new { id=1 })   // id is always changing

Benim şüphe bu "id" model.parameter bölümüne nasıl geçebilir ?

Denetleyicilerim:

 public ActionResult MemberHome(string id)
    {
        ViewBag.Details = id;
        return View();
    }
  public ActionResult MemberProfile(int id = 0)
    {
        MemberData md = new Member().GetMemberProfile(id);
        return PartialView("_ProfilePage",md);
    }

2
Anlamıyorum. Belki kontrolörünüzü ve eyleminizi eklerseniz yardımcı olabilir, ancak şimdi yazıldığı gibi, sorunuzu anlamıyorum.
— Liam

bkz . msdn'de kısmi uzatma
— Grundy

Yanıtlar:


346

Sorunuzu anlamak zordur, ancak özü alırsam, ana görünümünüzde o görünümde oluşturulmuş kısmi bir öğede erişmek istediğiniz bir değere sahip olursunuz.

Yalnızca kısmi adla bir kısmi oluşturursanız:

@Html.Partial("_SomePartial")

Aslında modelinizi, arayacağınız gibi örtük bir parametre olarak geçirir:

@Html.Partial("_SomePartial", Model)

Şimdi, kısmi öğenizin bunu gerçekten kullanabilmesi için, bunun da tanımlanmış bir modeli olması gerekir, örneğin:

@model Namespace.To.Your.Model

@Html.Action("MemberProfile", "Member", new { id = Model.Id })

Alternatif olarak, görünümünüzün modelinde olmayan bir değerle uğraşıyorsanız (ViewBag'de veya bir şekilde görünümün kendisinde oluşturulan bir değerse, bir ViewDataDictionary

@Html.Partial("_SomePartial", new ViewDataDictionary { { "id", someInteger } });

Ve sonra:

@Html.Action("MemberProfile", "Member", new { id = ViewData["id"] })

Modelde olduğu gibi, Razor kısmi görünümünüzü ViewDatavarsayılan olarak örtük olarak geçirecektir , bu nedenle ViewBag.Idgörüşünüze sahipseniz, aynı şeyi kısmi olarak referanslayabilirsiniz.


4
Ana modelinizin bir arabirim uygulamasını gerçekleştirirseniz, kısmi görünümün bu arabirimi model olarak kullanmasını sağlayabilirsiniz. Sonra bir sürü yeniden kullanabilirsiniz.
— Jess

@ChrisPratt Her zaman olduğu gibi çok açıklayıcı cevap :) Oylandı +
— Murat Yıldız

6
Bunun @Html.Partial("_SomePartial", new Microsoft.AspNet.Mvc.ViewFeatures.ViewDataDictionary(this.ViewData) { { "id", someInteger } });benim için çalışması için kullanmak zorundaydım . Başkasının aynı sorunu varsa VS2015 DNX 4.5.1 kullanıyorum.
— MikeTeeVee

46

Kendimi ararken tek bir değer için bulduğum en kısa yöntemden biri, sadece tek dize geçen ve bu gibi görünümünde model olarak dize ayarlama.

Kısmi arama tarafınızda

@Html.Partial("ParitalAction", "String data to pass to partial")

Ve sonra modeli Kısmi Görünüm ile böyle bağlayın

@model string

ve değerini Kısmi Görünümde böyle kullanmak

@Model

Dizi, int gibi diğer veri türleriyle veya IDictionary veya başka bir şey gibi daha karmaşık veri türleriyle de oynayabilirsiniz.

Umarım yardımcı olur,


4
Bu temiz! Tam olarak ne istediğimi. Teşekkürler.
— Gautam Jain

Benim kısmi benim model gerek yoktu, ama tüm ViewData ModelState şeyler korumak gerekiyordu .. bu hile yaptı. Kısmi görünümümde, hala ViewContext.ViewData.ModelState.ContainsKey (@ Model.ToString ())
— da_jokker

Bu NullReferenceException, bir nesnenin örneğine ayarlanmamış bir nesne başvurusu atmaya devam ediyor , bunun Modelboş olduğunu söylüyor . Herhangi bir fikir?
— facepalm42

15

İşte bir nesneyi ViewDataDictionary dönüştürecek bir uzantı yöntemi.

public static ViewDataDictionary ToViewDataDictionary(this object values)
{
    var dictionary = new ViewDataDictionary();
    foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(values))
    {
        dictionary.Add(property.Name, property.GetValue(values));
    }
    return dictionary;
}

Daha sonra görünümünüzde şu şekilde kullanabilirsiniz:

@Html.Partial("_MyPartial", new
{
    Property1 = "Value1",
    Property2 = "Value2"
}.ToViewDataDictionary())

Bu new ViewDataDictionary { { "Property1", "Value1" } , { "Property2", "Value2" }}sözdiziminden çok daha güzel .

Ardından kısmi görünümünüzde, ViewBagdizine alınan özellikler yerine dinamik bir nesneden özelliklere erişmek için kullanabilirsiniz ;

<p>@ViewBag.Property1</p>
<p>@ViewBag.Property2</p>

Bu ToViewDataDictionarystatik yöntemi nereye koymalıyım ? Her yere koymaya çalıştığım bir derleyici hatası alıyorum.
— Csaba Toth

2
@CsabaToth bu bir uzantı yöntemidir. Statik bir sınıfa yerleştirip görünümünüzde bu sınıfa başvurmanız yeterlidir.
— Chris Haines

3

Asp.Net core için daha iyi kullanırsınız

<partial name="_MyPartialView" model="MyModel" />

Yani mesela

@foreach (var item in Model)
{
   <partial name="_MyItemView" model="item" />
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.