¿Es posible usar HtmlHelper en un controlador, por ejemplo para obtener el método TextBox (...)? no es que no pueda escribir el html que me genera, pero solo quiero entender cómo funciona para poder crear la mejor solución.Uso de HtmlHelper en un controlador
Respuesta
He aquí un ejemplo adaptado de this:
var h = new HtmlHelper(new ViewContext(ControllerContext, new WebFormView("omg"), new ViewDataDictionary(), new TempDataDictionary()), new ViewPage());
h.TextBox("myname");
Tenga en cuenta que este es un truco, se puede hacer, pero no creo que haya ninguna buena razón para hacer esto ...
El HtmlHelper es parte del mecanismo de Vista por diseño y debe considerarse separado de las partes de Controlador y Modelo de MVC. No estoy seguro de por qué querría generar controles dentro del controlador ya que su función es entregar los datos a la vista para su renderizado.
No estoy diciendo que no pueda lograrlo, pero para un buen diseño sería mejor.
¿Puede explicar lo que está tratando de lograr y luego podríamos verlo de una manera "MVC"?
Lo estaba usando como una forma de generar el html del control basado en una selección de usuario en una forma ajax. Intentando obtener el mismo concepto que los formularios Rails RJS. Aunque la solución provista funcionó, acepto que esta no es la solución más limpia y, probablemente, terminaré convirtiéndola en parte del cliente. – Gil
puede utilizar el método de esta manera:
public static HtmlHelper GetHtmlHelper(this Controller controller)
{
var viewContext = new ViewContext(controller.ControllerContext, new FakeView(), controller.ViewData, controller.TempData, TextWriter.Null);
return new HtmlHelper(viewContext, new ViewPage());
}
public class FakeView : IView
{
public void Render(ViewContext viewContext, TextWriter writer)
{
throw new InvalidOperationException();
}
}
piensa agregar "using System.Web.Mvc.Html;" obtener toda la extensión HtmlHelper (esto es con MVC 3) – Dragouf
Una buena forma de usar htmlhelper en el controlador con mvc 3 es llamar al método parcial para representar html de una vista (por ejemplo, para usar la vista de afeitar como plantilla html email) – Dragouf
Esto es exactamente lo que estaba buscando, funciona como un encanto. Gracias por compartir este código – ViRuSTriNiTy
using System.Web.Mvc;
using System.Web.Mvc.Html;
var h = new HtmlHelper<Effort>(new ViewContext(ControllerContext, new WebFormView(ControllerContext, "omg"), new ViewDataDictionary(), new TempDataDictionary(), new StringWriter()), new ViewPage());
h.DisplayFor(e => Model.Efforts[i].Content.Offer.Price1.Value)
esto me ayudó. –
el único que realmente funcionó en un tiempo aquí – matthy
Si alguien está tratando de hacer esto desde sin un controlador (como cuando la unidad de pruebas), hay más problemas para hacer frente, ya que muchos de estos métodos (que yo sé, no eran un escenario de prueba, sino para ese escenario) arrojaban excepciones nulas (ViewContext.ScopeCache
). Esto se puede ver por la siguiente (tenga en cuenta todos estos aspectos requieren una instancia ViewContext
a formar, que es uno de los parámetros se insertan en el constructor de la instancia HtmlHelper, por lo que en ese objeto):
viewContext.UnobtrusiveJavaScriptEnabled = false;
Simplemente establecer ese valor arroja una excepción con muchos de estos métodos, pero el problema se solucionó para mí by this answer, vea cómo obtiene un HtmlHelper
(vea también here).
- usando System.Web.Mvc;
usando System.Web.Mvc.Html;
HtmlHelper helper = new HtmlHelper(new ViewContext(ControllerContext, new WebFormView(ControllerContext, "Index"), new ViewDataDictionary(), new TempDataDictionary(), new System.IO.StringWriter()), new ViewPage());
Para .NET Core 2 MVC: https://github.com/aspnet/Mvc/issues/7321
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Infrastructure;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Mvc.Routing;
using Microsoft.AspNetCore.Mvc.ViewEngines;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Mvc.ViewFeatures.Internal;
using Microsoft.Extensions.Options;
using System.IO;
using System.Text.Encodings.Web;
using System.Threading.Tasks;
public class HelperGenerator
{
private readonly IHtmlGenerator _htmlGenerator;
private readonly ICompositeViewEngine _compositeViewEngine;
private readonly IModelMetadataProvider _modelMetadataProvider;
private readonly IViewBufferScope _viewBufferScope;
private readonly IActionContextAccessor _actionContextAccessor;
private readonly HtmlHelperOptions _htmlHelperOptions;
public HelperGenerator(IHtmlGenerator htmlGenerator, ICompositeViewEngine compositeViewEngine, IModelMetadataProvider modelMetadataProvider, IViewBufferScope viewBufferScope, IActionContextAccessor actionContextAccessor, IOptions<MvcViewOptions> options)
{
_htmlGenerator = htmlGenerator;
_compositeViewEngine = compositeViewEngine;
_modelMetadataProvider = modelMetadataProvider;
_viewBufferScope = viewBufferScope;
_actionContextAccessor = actionContextAccessor;
_htmlHelperOptions = options.Value.HtmlHelperOptions;
}
public IHtmlHelper HtmlHelper(ViewDataDictionary ViewData, ITempDataDictionary TempData)
{
var helper = new HtmlHelper(_htmlGenerator, _compositeViewEngine, _modelMetadataProvider, _viewBufferScope, HtmlEncoder.Default, UrlEncoder.Default);
var viewContext = new ViewContext(_actionContextAccessor.ActionContext,
new FakeView(),
ViewData,
TempData,
TextWriter.Null,
_htmlHelperOptions);
helper.Contextualize(viewContext);
return helper;
}
private class FakeView : IView
{
public string Path => "View";
public Task RenderAsync(ViewContext context)
{
return Task.FromResult(0);
}
}
}
Asegúrese de registrar en los servicios:
services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
- 1. Uso de MVC HtmlHelper desde un WebForm
- 2. Cómo crear una URL en un controlador como HtmlHelper
- 3. ¿Cómo se obtiene un ID personalizado para hacer uso de HtmlHelper en MVC
- 4. Encontrar Nombre del área y el nombre del controlador en HtmlHelper personalizada con ASP.NET MVC3
- 5. métodos HtmlHelper y RouteValueDictionary
- 6. Uso del controlador JTDS
- 7. Uso del controlador Android
- 8. HtmlHelper NameFor method
- 9. Uso de Html.ActionLink y Url.Action (...) desde el interior del controlador
- 10. ¿Cómo se puede utilizar HtmlHelper para crear un hipervínculo externo?
- 11. ¿Por qué no funcionan mis extensiones HtmlHelper?
- 12. Dado htmlHelper + nombre de acción, ¿cómo averiguar el nombre del controlador?
- 13. Uso de más de un controlador con ExtJS 4 MVC
- 14. Uso de esterilizar dentro de un controlador Rails
- 15. Acceder a User.Identity.Name en la clase HTMLHelper
- 16. ¿Cómo obtener la ruta actual en HtmlHelper?
- 17. clase HtmlHelper en System.Web.Webpages.Html vs System.Web.Mvc espacios de nombres
- 18. Uso MVC enrutamiento poner un alias para un controlador
- 19. Uso del controlador ODBC en Qt
- 20. Uso de un controlador base para obtener Common ViewData
- 21. Uso de un codificador rotatorio con controlador AVR Micro
- 22. ¿Hay un ASP.NET MVC HtmlHelper para enlaces de imagen?
- 23. Codificación HTML para HtmlHelper Método de extensión
- 24. Uso de verificación nula en el controlador de eventos
- 25. NullReferenceException problema con ASP.NET MVC cuadro de texto HtmlHelper
- 26. Agregar a routeValues en el método de extensión HtmlHelper
- 27. Ayuda con ASP.NET MVC HtmlHelper API Diseño
- 28. ¿Utiliza alguna extensión personalizada ASP.NET MVC HtmlHelper?
- 29. Cómo probar la unidad HtmlHelper con Moq?
- 30. Google Chart HtmlHelper para Asp.net Mvc
no creo que es una cosa fantástica para hacer cualquiera , pero estoy usando controles de cuadrícula de Telerik que usan AJAX, y cuando uso AJAX, el ClientTemplate para una columna debe ser texto renderizado previamente - no podrá res olve la acción en el cliente. Esa es mi razón para buscar esto, en cualquier caso. Preferiría que los controles no funcionaran de esta manera, pero si es el precio que pagué por tener un control de años luz mejor que cualquier cosa que pudiera hacer, entonces es algo que solucionaré. –
este ejemplo no es válido ahora – Anubis
@Anubis: ¿qué quiere decir con 'ahora'? ASP.NET MVC 3? –