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.