Как я могу передать параметры для частичного просмотра в MVC 4

152

У меня есть такая ссылка:

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

и когда я нажму на это, он вызовет эту частичную страницу:

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

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

    }
}

Частичная страница _Profile содержит:

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

Пример:

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

Я сомневаюсь, что как я могу передать этот "Id" в часть 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

Ответы:

347

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

Если вы просто визуализируете частичное с только частичным именем:

@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 Очень объяснительный ответ как всегда :) Проголосовал +
Мурат Йылдыз
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")

А затем связать модель с частичным видом, как это

@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статический метод? Везде, где я пытаюсь это выразить, я получаю какую-то ошибку компилятора.
Чаба Тот
2
@ CsabaToth это метод расширения. Просто поместите его в статический класс и затем ссылайтесь на этот класс в своем представлении.
Крис Хейнс
3

Для ядра Asp.Net лучше использовать

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

Так например

@foreach (var item in Model)
{
   <partial name="_MyItemView" model="item" />
}
Gerard
источник