È possibile utilizzare HtmlHelper in un controller, ad esempio per ottenere il metodo TextBox (...)? Non che io non possa scrivere l'html che genera me stesso, ma voglio solo capire come funziona così posso creare la soluzione migliore.Utilizzo di HtmlHelper in un controller
risposta
Ecco un esempio tratto dal this:
var h = new HtmlHelper(new ViewContext(ControllerContext, new WebFormView("omg"), new ViewDataDictionary(), new TempDataDictionary()), new ViewPage());
h.TextBox("myname");
Si noti che questo è un hack, si può fare, ma non credo che ci sia una buona ragione per fare questo ...
Il HtmlHelper è parte del meccanismo di visualizzazione in base alla progettazione e deve essere considerato separato per le parti del controller e del modello di MVC. Non sono sicuro del motivo per cui si desidera generare controlli all'interno del controller poiché il ruolo è quello di fornire i dati alla vista per il rendering.
Non sto dicendo che non è possibile raggiungerlo, ma per un buon design sarebbe meglio.
Puoi spiegare cosa stai cercando di ottenere e quindi potremmo considerarlo in un "modo MVC"?
Lo stavo usando come un modo per generare l'html del controllo basato su una selezione utente in un modulo Ajax. Cercando di ottenere lo stesso concetto dei moduli Rails RJS. Sebbene la soluzione fornita abbia funzionato, sono d'accordo sul fatto che questa non è la soluzione più pulita e probabilmente finirò per rendere tutto ciò lato client, dopo tutto. – Gil
È possibile utilizzare metodo come questo:
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();
}
}
pensa di aggiungere "using System.Web.Mvc.Html;" per ottenere tutte le estensioni HtmlHelper (questo è con MVC 3) – Dragouf
Un buon modo per usare htmlhelper nel controller con mvc 3 è chiamare il metodo Parziale per rendere html di una vista (per esempio per usare la vista del rasoio come modello html email) – Dragouf
Questo è esattamente quello che stavo cercando, funziona come un fascino. Grazie per aver condiviso questo codice. – 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)
questo mi ha aiutato. –
l'unico che ha funzionato davvero in una volta qui – matthy
Se qualcuno sta cercando di fare questo da senza un controller (come quando test di unità), ci sono altri problemi da affrontare, come molti di questi metodi (che so, non erano uno scenario di test, ma per quello scenario) lanciavano eccezioni Null (ViewContext.ScopeCache
). Si può vedere questo dal seguente (nota tutti questi modi richiedono un'istanza ViewContext
a formarsi, che è uno dei parametri che si inserisce nel costruttore dell'istanza HtmlHelper, così via quell'oggetto):
viewContext.UnobtrusiveJavaScriptEnabled = false;
Semplicemente impostando quel valore si genera un'eccezione con molti di questi metodi, ma il problema è stato risolto per me by this answer, vedere come ottiene un HtmlHelper
(vedere anche here).
- utilizzando System.Web.Mvc;
utilizzando 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());
Per .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);
}
}
}
Assicurati di registrare nel settore dei servizi:
services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
- 1. Utilizzo di MVC HtmlHelper da un WebForm
- 2. Utilizzo delle estensioni MVC HtmlHelper dalle viste dichiarative di Razor
- 3. Dato htmlHelper + nome dell'azione, come capire il nome del controller?
- 4. creare istanza htmlhelper di un altro tipo
- 5. Utilizzo di View Controller dallo storyboard in modo programmatico in un controller di visualizzazione pagine
- 6. Classe HtmlHelper in System.Web.Webpages.Html vs Namespace System.Web.Mvc
- 7. Utilizzo di un controller figlio da un altro modulo
- 8. Utilizzo di sterilizzazione all'interno di un controller Rails
- 9. Utilizzo di [Visualizza (Nome = "X")] con enum. HtmlHelper personalizzato in MVC3 ASP.Net
- 10. Aggiornamento di una variabile di servizio in un controller e utilizzo del valore aggiornato in un altro controller - Angular JS
- 11. Trova nome Area e Nome del controller in HtmlHelper personalizzato con ASP.NET MVC3
- 12. Utilizzo di jQuery per chiamare un controller Azione
- 13. Utilizzo di più controller in una vista in Rails
- 14. Utilizzo di ocLazyLoad per caricare pigro un controller con $ stateProvider
- 15. Utilizzo di number_with_precision sul controller nelle guide3
- 16. Come ottenere il percorso corrente in HtmlHelper?
- 17. AngularJS - Multiple utilizzo Filtri controller
- 18. Emissione di un collegamento ipertestuale da un controller in cakePHP
- 19. Unit Testing Un metodo di estensione su HtmlHelper
- 20. Codifica HTML per HtmlHelper Extension Method
- 21. Utilizzo di controller e percorsi separati in Node.js
- 22. Accesso User.Identity.Name nella classe HTMLHelper
- 23. HtmlHelper metodo di estensione vs vista parziale?
- 24. Chiamare un metodo di controller in un altro controller Ember
- 25. Utilizzo del metodo bindData all'esterno del controller
- 26. Utilizzo di servizi e DAO nel controller mvc di primavera
- 27. Utilizzo di risorse con nomi di controller personalizzati
- 28. Esiste un HtmlHelper ASP.NET MVC per i collegamenti immagine?
- 29. Aiuto con ASP.NET MVC HtmlHelper API Design
- 30. Ho bisogno di un controller "Utenti" quando utilizzo Devise in Rails
non credo che sia una cosa fantastica da fare sia , ma sto usando i controlli di griglia di Telerik che usano AJAX, e quando si usa AJAX, ClientTemplate per una colonna deve essere testo pre-renderizzato - non sarà in grado di res olve l'azione sul client. Questa è la ragione per cui ho cercato, comunque. Preferirei che i controlli non funzionassero in questo modo, ma se è il prezzo che pago per aver controllato anni luce meglio di qualsiasi cosa potrei fare, allora è qualcosa su cui lavorerò. –
questo esempio non è valido ora – Anubis
@Anubis: cosa intendi con 'ora'? ASP.NET MVC 3? –