asp.net-mvc - usar - pasar datos de una vista a un controlador c#
¿Cómo puedo pasar parámetros a una vista parcial en mvc 4? (3)
Tengo un enlace como este:
<a href=''Member/MemberHome/Profile/Id''><span>Profile</span></a>
y cuando hago clic en esto llamará a esta página parcial:
@{
switch ((string)ViewBag.Details)
{
case "Profile":
{
@Html.Partial("_Profile"); break;
}
}
}
La página parcial _Profile contiene:
Html.Action("Action", "Controller", model.Paramter)
Ejemplo:
@Html.Action("MemberProfile", "Member", new { id=1 }) // id is always changing
Mi duda es que ¿cómo puedo pasar esta parte del parámetro "Id" a model.parameter ?
Mis controladores son:
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);
}
Aquí hay un método de extensión que convertirá un objeto en un 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;
}
Luego puede usarlo en su vista de esta manera:
@Html.Partial("_MyPartial", new
{
Property1 = "Value1",
Property2 = "Value2"
}.ToViewDataDictionary())
Que es mucho mejor que la new ViewDataDictionary { { "Property1", "Value1" } , { "Property2", "Value2" }}
sintaxis new ViewDataDictionary { { "Property1", "Value1" } , { "Property2", "Value2" }}
.
Luego, en su vista parcial, puede usar ViewBag
para acceder a las propiedades desde un objeto dinámico en lugar de propiedades indexadas, por ejemplo
<p>@ViewBag.Property1</p>
<p>@ViewBag.Property2</p>
Tu pregunta es difícil de entender, pero si obtengo lo esencial, simplemente tienes algún valor en tu vista principal al que quieras acceder en una representación parcial en esa vista.
Si solo procesa un parcial con solo el nombre parcial:
@Html.Partial("_SomePartial")
Pasará su modelo como un parámetro implícito, lo mismo que si llamara:
@Html.Partial("_SomePartial", Model)
Ahora, para que su parcial realmente pueda usar esto, también necesita tener un modelo definido, por ejemplo:
@model Namespace.To.Your.Model
@Html.Action("MemberProfile", "Member", new { id = Model.Id })
Alternativamente, si está tratando con un valor que no está en el modelo de su vista (está en el ViewBag o en un valor generado en la vista de alguna manera, entonces puede pasar un ViewDataDictionary
@Html.Partial("_SomePartial", new ViewDataDictionary { { "id", someInteger } });
Y entonces:
@Html.Action("MemberProfile", "Member", new { id = ViewData["id"] })
Al igual que con el modelo, Razor pasará implícitamente su ViewBag.Id
parcial de la vista de forma predeterminada, por lo que si tiene ViewBag.Id
en su vista, puede hacer referencia a lo mismo en su parcial.
Uno de los métodos más cortos que encontré para el valor único mientras estaba buscando por mí mismo, es simplemente pasar una sola cadena y establecer la cadena como modelo en vista de esta manera.
En tu lado de llamadas parciales
@Html.Partial("ParitalAction", "String data to pass to partial")
Y luego vinculando el modelo con una vista parcial como esta
@model string
y el uso de su valor en Vista parcial como este
@Model
También puede jugar con otros tipos de datos como array, int o tipos de datos más complejos como IDictionary u otra cosa.
Espero eso ayude,