Як я можу передати параметри частковому перегляду в mvc 4


152

У мене є таке посилання:

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

і коли я натискаю на це, він називає цю часткову сторінку:

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

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

    }
}

Часткова сторінка _Профільм містить:

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

Приклад:

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

Мої сумніви в тому, що як я можу передати цей "Ідентифікатор" на частину model.parameter ?

Мої контролери:

 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
Я не розумію. Можливо, якщо ви додасте свій контролер і дія може допомогти, але, як це написано зараз, я не розумію вашого питання.
Ліам

дивіться про Часткове розширення в msdn
Grundy

Відповіді:


346

Ваше питання важко зрозуміти, але якщо я отримую суть, у вас просто є деяка цінність у вашому головному огляді, до якого ви хочете отримати доступ, якщо частково виноситься в цей вид.

Якщо ви просто надаєте частку лише з частковою назвою:

@Html.Partial("_SomePartial")

Він фактично передасть вашу модель як неявний параметр, такий самий, як якщо б ви телефонували:

@Html.Partial("_SomePartial", Model)

Тепер для того, щоб ваша часткова частина могла реально використовувати це, хоча, вона теж повинна мати визначену модель, наприклад:

@model Namespace.To.Your.Model

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

Крім того, якщо ви маєте справу зі значенням, яке не відповідає моделі вашого перегляду (це в ViewBag або значенні, яке якимось чином генерується в самому представленні, ви можете передати ViewDataDictionary

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

І потім:

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

Як і у випадку з моделлю, Razor ViewDataза замовчуванням неявно передасть ваше часткове перегляд , тож якщо у вас було ViewBag.Idпредставлення, ви можете посилатися на те саме у своєму частковому.


4
Якщо ваша головна модель реалізує інтерфейс, ви можете мати частковий вигляд використовувати цей інтерфейс як модель. Тоді ви можете отримати багато повторного використання з нього.
Джесс

@ChrisPratt Дуже пояснювальна відповідь, як завжди :) Проголосував +
Murat Yıldız

6
Мені довелося скористатися @Html.Partial("_SomePartial", new Microsoft.AspNet.Mvc.ViewFeatures.ViewDataDictionary(this.ViewData) { { "id", someInteger } });для цього, щоб працювати на мене. Я використовую VS2015 DNX 4.5.1, якщо хтось ще має цю проблему.
MikeTeeVee

46

Один з найкоротших методів, який я знайшов для одного значення, коли я шукав себе, - це просто передача однієї рядка та встановлення рядка як моделі з точки зору цього.

У вашій частковій стороні дзвінка

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

А потім прив’язування моделі до Partial View, як це

@model string

і використання його значення в частковому перегляді, як це

@Model

Ви також можете грати з іншими типами даних, такими як масив, int або більш складні типи даних, такі як IDictionary або щось інше.

Сподіваюся, це допоможе,


4
Це акуратно! Саме те, що я хотів. Дякую.
Гаутам Джайн

Моїй частковій моїй моделі не потрібна, але мені потрібно було зберегти всі матеріали ViewData ModelState. Це зробило трюк. У моєму частковому перегляді я все ще можу отримати доступ до ViewContext.ViewData.ModelState.ContainsKey (@ Model.ToString ())
da_jokker

Це продовжує викидати NullReferenceExceptionпосилання на об'єкт, не встановлене на екземпляр об'єкта, це означає, що Modelце недійсне значення. Будь-які ідеї?
facepalm42

15

Ось метод розширення, який перетворить об’єкт у 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;
}

Потім ви можете використовувати його на ваш погляд так:

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

Що набагато приємніше new ViewDataDictionary { { "Property1", "Value1" } , { "Property2", "Value2" }}синтаксису.

Тоді у вашому частковому перегляді ви можете використовуватись ViewBagдля доступу до властивостей динамічного об'єкта, а не до індексованих властивостей, наприклад

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

Куди мені поставити цей ToViewDataDictionaryстатичний метод? Скрізь, де я намагаюся це зробити, я отримую якусь помилку компілятора.
Csaba Toth

2
@CsabaToth це метод розширення. Просто розмістіть його в статичному класі, а потім посилайтеся на цей клас на ваш погляд.
Кріс Хейнс

3

Для ядра Asp.Net ви краще використовуєте

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

Так, наприклад

@foreach (var item in Model)
{
   <partial name="_MyItemView" model="item" />
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.