Как передать параметры на частичный вид в 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" />
}