Как передать параметры на частичный вид в mvc 4

У меня есть ссылка вроде этого:

 <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 part?

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

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

Ответ 1

Трудно понять ваш вопрос, но если я получаю суть, у вас просто есть какое-то значение в вашем основном представлении, которое вы хотите получить в частичном представлении в этом представлении.

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

@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 в вашем представлении, вы можете ссылаться на одно и то же в частичном.

Ответ 2

Один из самых коротких методов, которые я нашел для одиночного значения, когда я искал себя, просто передает одну строку и устанавливает строку как модель в виде, подобном этому.

В вашей частичной стороне вызова

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

И затем привязка модели к Partial View, подобной этой

@model string

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

@Model

Вы также можете играть с другими типами данных, такими как массив, int или более сложные типы данных, такие как IDictionary или что-то еще.

Надеюсь, что это поможет,

Ответ 3

Вот метод расширения, который преобразует объект в 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>

Ответ 4

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

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

Так например

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