Bagaimana saya bisa meneruskan parameter ke tampilan parsial di mvc 4

152

Saya memiliki tautan seperti ini:

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

dan ketika saya mengklik ini akan memanggil halaman parsial ini:

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

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

    }
}

Halaman parsial _Profile berisi:

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

Contoh:

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

Keraguan saya adalah bagaimana saya bisa meneruskan "Id" ini ke bagian model.parameter ?

Pengontrol saya adalah:

 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);
    }
neel
sumber
2
Saya tidak mengerti. Mungkin jika Anda menambahkan controller dan action Anda mungkin membantu, tetapi seperti yang ditulis sekarang, saya tidak mengerti pertanyaan Anda.
Liam
lihat tentang ekstensi parsial di msdn
Grundy

Jawaban:

346

Pertanyaan Anda sulit dimengerti, tetapi jika saya mendapatkan intinya, Anda hanya memiliki beberapa nilai di tampilan utama Anda yang ingin Anda akses sebagian yang diberikan dalam tampilan itu.

Jika Anda hanya merender sebagian hanya dengan nama parsial:

@Html.Partial("_SomePartial")

Ini sebenarnya akan meneruskan model Anda sebagai parameter implisit, sama seperti jika Anda memanggil:

@Html.Partial("_SomePartial", Model)

Sekarang, agar parsial Anda benar-benar dapat menggunakan ini, juga perlu memiliki model yang ditentukan, misalnya:

@model Namespace.To.Your.Model

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

Atau, jika Anda berurusan dengan nilai yang tidak ada pada model tampilan Anda (itu ada di ViewBag atau nilai yang dihasilkan dalam tampilan itu sendiri, maka Anda dapat memberikan ViewDataDictionary

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

Lalu:

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

Seperti halnya model, Razor secara implisit akan melewatkan tampilan parsial Anda ViewDatasecara default, jadi jika Anda ViewBag.Idmelihatnya, maka Anda dapat merujuk hal yang sama di parsial Anda.

Chris Pratt
sumber
4
Jika Anda membuat model utama Anda mengimplementasikan antarmuka, Anda dapat memiliki tampilan parsial menggunakan antarmuka itu sebagai model. Maka Anda bisa mendapatkan banyak penggunaan kembali darinya.
Jess
@ChrisPratt Jawaban yang sangat jelas seperti biasa :) Terpilih +
Murat Yıldız
6
Saya harus menggunakan @Html.Partial("_SomePartial", new Microsoft.AspNet.Mvc.ViewFeatures.ViewDataDictionary(this.ViewData) { { "id", someInteger } });ini untuk bekerja untuk saya. Saya menggunakan VS2015 DNX 4.5.1 jika ada orang lain yang memiliki masalah yang sama.
MikeTeeVee
46

Salah satu metode terpendek yang saya temukan untuk nilai tunggal ketika saya mencari sendiri, hanya melewati string tunggal dan menetapkan string sebagai model dalam tampilan seperti ini.

Di sisi Panggilan parsial Anda

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

Dan kemudian mengikat model dengan Partial View seperti ini

@model string

dan penggunaan nilainya dalam Tampilan Parsial seperti ini

@Model

Anda juga bisa bermain dengan tipe data lain seperti array, int atau tipe data yang lebih kompleks seperti IDictionary atau yang lainnya.

Semoga ini bisa membantu,

Syekh Osama
sumber
4
Ini rapi! Apa yang saya inginkan. Terima kasih.
Gautam Jain
Parsial saya tidak memerlukan model saya, tetapi saya harus melestarikan semua barang ModelState ViewData .. ini berhasil. Dalam pandangan parsial saya, saya masih dapat mengakses ViewContext.ViewData.ModelState.ContainsKey (@ Model.ToString ())
da_jokker
Ini terus melempar NullReferenceException, referensi objek tidak diatur ke instance objek, itu mengatakan bahwa Modelitu nol. Ada ide?
facepalm42
15

Berikut adalah metode ekstensi yang akan mengonversi objek ke ViewDataDictionary.

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;
}

Anda kemudian dapat menggunakannya dalam tampilan seperti:

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

Yang jauh lebih bagus daripada new ViewDataDictionary { { "Property1", "Value1" } , { "Property2", "Value2" }}sintaksis.

Kemudian dalam tampilan parsial Anda, Anda dapat menggunakan ViewBaguntuk mengakses properti dari objek dinamis daripada properti yang diindeks, misalnya

<p>@ViewBag.Property1</p>
<p>@ViewBag.Property2</p>
Chris Haines
sumber
Di mana saya harus meletakkan ToViewDataDictionarymetode statis ini ? Di mana-mana saya mencoba mengatakannya saya mendapatkan semacam kesalahan kompiler.
Csaba Toth
2
@CsabaToth ini adalah metode ekstensi. Tempatkan saja di kelas statis dan kemudian referensi kelas itu di tampilan Anda.
Chris Haines
3

Untuk inti Asp.Net lebih baik Anda gunakan

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

Jadi misalnya

@foreach (var item in Model)
{
   <partial name="_MyItemView" model="item" />
}
Gerard
sumber