una - Crear controlador para vista parcial en ASP.NET MVC
que es una vista parcial mvc (6)
¿Cómo puedo crear un controlador y modelo individual para una vista parcial? Quiero poder ubicar esta vista parcial en cualquier parte del sitio, así que necesita su propio controlador. Estoy actualizando el parcial como tal
@Html.Partial("_Testimonials")
¿Por qué no usar Html.RenderAction()
?
Luego, puede poner lo siguiente en cualquier controlador (incluso creando un nuevo controlador para él):
[ChildActionOnly]
public ActionResult MyActionThatGeneratesAPartial(string parameter1)
{
var model = repository.GetThingByParameter(parameter1);
var partialViewModel = new PartialViewModel(model);
return PartialView(partialViewModel);
}
Luego, podría crear una nueva vista parcial y hacer que PartialViewModel
sea de lo que hereda.
Para Razor, el bloque de código en la vista se vería así:
@{ Html.RenderAction("Index", "Home"); }
Para WebFormsViewEngine, se vería así:
<% Html.RenderAction("Index", "Home"); %>
Html.Action es una tecnología mal diseñada. Debido a que en su Controlador de página no puede recibir los resultados del cálculo en su Controlador Parcial. El flujo de datos es solo Controlador de página => Controlador parcial.
Para estar más cerca de WebForm UserControl (* .ascx), necesita:
Crear una página Modelo y un modelo parcial
Coloque su modelo parcial como una propiedad en su página Modelo
- En la vista de la página use Html.EditorFor (m => m.MyPartialModel)
- Crea una vista parcial apropiada
- Cree una clase muy similar a ese Controlador de Acción Infantil descrito aquí en respuestas muchas veces. Pero será solo una clase (heredada de Object en lugar de Controller). Vamos a nombrarlo como MyControllerPartial. MyControllerPartial solo sabrá sobre el Modelo parcial.
- Use su MyControllerPartial en su controlador de página. Pase el modelo. MyPartialModel a MyControllerPartial
- Tenga cuidado con el prefijo correcto en su MyControllerPartial. Ejemplo de Fox: ModelState.AddError ("MyPartialModel." + "SomeFieldName", "Error")
- En MyControllerPartial puede validar e implementar otras lógicas relacionadas con este Modelo Parcial
En esta situación, puedes usarlo como:
public class MyController : Controller
{
....
public MyController()
{
MyChildController = new MyControllerPartial(this.ViewData);
}
[HttpPost]
public ActionResult Index(MyPageViewModel model)
{
...
int childResult = MyChildController.ProcessSomething(model.MyPartialModel);
...
}
}
PS En el paso 3 puede usar Html.Partial ("PartialViewName", Model.MyPartialModel, <clone_ViewData_with_prefix_MyPartialModel>). Para más detalles, vea las vistas parciales de ASP.NET MVC: prefijos de nombre de entrada
Lo más importante es que la acción creada debe devolver vista parcial, ver a continuación.
public ActionResult _YourPartialViewSection()
{
return PartialView();
}
No necesita su propio controlador. Puedes usar
@Html.Partial("../ControllerName/_Testimonials.cshtml")
Esto le permite representar el parcial desde cualquier página. Solo asegúrate de que la ruta relativa sea la correcta.
No necesita un controlador y cuando usa .Net 5 (MVC 6) puede renderizar la vista parcial asincrónica
@await Html.PartialAsync("_LoginPartial")
o
@{await Html.RenderPartialAsync("PartialName");}
Si fuera yo, simplemente crearía un nuevo Controlador con una sola Acción y luego usaría RenderAction en lugar de Parcial:
// Assuming the controller is named NewController
@{Html.RenderAction("ActionName",
"New",
new { routeValueOne = "SomeValue" });
}