Ist es möglich, HtmlHelper in einem Controller zu verwenden, um beispielsweise die TextBox (...) -Methode zu erhalten? Nicht, dass ich nicht das HTML schreiben kann, das es selbst erzeugt, aber ich möchte nur verstehen, wie das funktioniert, damit ich die beste Lösung erstellen kann.Verwenden von HtmlHelper in einem Controller
Antwort
Hier ist ein Beispiel von this angepasst:
var h = new HtmlHelper(new ViewContext(ControllerContext, new WebFormView("omg"), new ViewDataDictionary(), new TempDataDictionary()), new ViewPage());
h.TextBox("myname");
Beachten Sie, dass dies ein Hack ist, es kann getan werden, aber ich glaube nicht, dass es ein guter Grund, dies zu tun ...
Die HtmlHelper ist von Entwurf her Teil des View-Mechanismus und sollte getrennt von den Controller- und Modellteilen von MVC betrachtet werden. Ich bin mir nicht sicher, warum Sie Kontrollen innerhalb des Controllers generieren möchten, da es die Aufgabe ist, die Daten zum Rendern an die Ansicht zu liefern.
Ich sage nicht, dass Sie es nicht erreichen können, aber für gutes Design wäre es besser.
Können Sie erklären, was Sie erreichen möchten, und dann könnten wir es auf "MVC-Weise" machen?
Ich benutzte es als eine Möglichkeit, das HTML des Steuerelements basierend auf einer Benutzerauswahl in einem AJAX-Formular zu generieren. Versuchen, das gleiche Konzept wie Rails RJS Formulare zu erhalten. Obwohl die gelieferte Lösung funktioniert, stimme ich zu, dass dies nicht die sauberste Lösung ist, und ich werde wahrscheinlich am Ende alle Client-Seite schließlich machen. – Gil
Sie können Methode wie folgt verwenden:
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();
}
}
denke, um "using System.Web.Mvc.Html;" Um alle HtmlHelper-Erweiterung zu bekommen (dies ist mit MVC 3) – Dragouf
Eine nette Möglichkeit, HTML-Helper in Controller mit MVC 3 zu verwenden, ist Teilmethode aufrufen, um HTML einer Ansicht zu rendern (zum Beispiel Rasierer Ansicht als Vorlage HTML-E-Mail) – Dragouf
Dies ist genau das, wonach ich suchte, wirkt wie ein Zauber. Vielen Dank für die Freigabe dieses Codes. – 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)
das hat mir geholfen. –
der einzige, der hier wirklich einmal funktioniert hat – matthy
Wenn jemand dies versucht, von ohne Controller zu tun (wie wenn Unit-Tests), gibt es weitere Probleme zu behandeln, wie viele Diese Methoden (von denen ich weiß, dass sie kein Testszenario waren, sondern für dieses Szenario) haben Null-Ausnahmen ausgelöst (ViewContext.ScopeCache
). Sie können dies sehen durch die folgende (beachten Sie alle diese Möglichkeiten erfordern eine ViewContext
Instanz gebildet werden, was einer der Parameter, die Sie in den Konstruktor der Htmlhelper Instanz einlegen, so auf das Objekt):
viewContext.UnobtrusiveJavaScriptEnabled = false;
Einfach diesen Wert zu setzen, löst bei vielen dieser Methoden eine Ausnahme aus, aber das Problem wurde für mich behoben by this answer, sehen Sie, wie er eine HtmlHelper
bekommt (siehe auch here).
- mit System.Web.Mvc;
mit 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());
Für .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);
}
}
}
Stellen Sie sicher, in Dienste registrieren:
services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
- 1. Verwenden eines MVC HtmlHelper aus einem WebForm
- 2. Custom HtmlHelper (Bild in einem ActionLink)
- 3. So erstellen Sie eine URL in Controller wie HtmlHelper
- 4. Verwenden von MVC HtmlHelper-Erweiterungen von deklarativen Ansichten von Razor
- 5. Verwenden Sie benutzerdefinierte ASP.NET MVC HtmlHelper-Erweiterungen?
- 6. So verwenden Sie Methoden von einem Controller in einem anderen
- 7. Aktion von einem Controller als Filter in einem anderen Controller in Rails verwenden
- 8. Metadaten vs ViewData in HtmlHelper
- 9. Verwenden eines Formulars in einem benutzerdefinierten Controller?
- 10. AngularJS - Verwenden von NgRoute-Parametern in einem Controller-Namen
- 11. Verwenden von ng-select und if else in einem Controller
- 12. Gegeben htmlHelper + action name, wie Controller Name herauszufinden?
- 13. Daten von einem Controller in einem anderen Controller abrufen
- 14. HtmlHelper fehlt?
- 15. SiteMap HtmlHelper ASP.NET MVC
- 16. HtmlHelper NameFür Methode
- 17. Verwenden Sie htmlhelper, um Aktion in BeginForm() Methode von ASP.NET MVC 3
- 18. HtmlHelper-Klasse in System.Web.Webpages.Html vs System.Web.Mvc Namespaces
- 19. Controller-Aktion von einem anderen Controller Render
- 20. Controller-Eigenschaft von einem anderen Controller ändern
- 21. htmlHelper vs Teilansicht
- 22. Verwenden von View Controller vom Storyboard programmgesteuert in einem Page View Controller
- 23. Controller in Helfer verwenden
- 24. Verwenden Sie mehrere Tabelle in einem Controller in CakePhp 3
- 25. URL aus HtmlHelper erstellen
- 26. Verwenden von number_with_precision auf Controller in rails3
- 27. Laravel json von Controller in jquery verwenden
- 28. Wie Funktion in Controller von einem anderen Controller aufrufen?
- 29. Warum funktionieren meine HtmlHelper-Erweiterungen nicht?
- 30. kann anfordern Querystring zugegriffen werden von htmlhelper
Ich glaube nicht, dass es eine fantastische Sache ist entweder zu tun , aber ich verwende Telerik Grid-Steuerelemente, die AJAX verwenden, und wenn AJAX verwendet wird, muss das ClientTemplate für eine Spalte vorgerenderter Text sein - es wird nicht res sein können olve die Aktion auf dem Client. Das ist jedenfalls mein Grund, um nachzusehen. Ich würde es bevorzugen, wenn die Steuerung nicht so funktioniert, aber wenn es der Preis ist, den ich dafür bezahle, Lichtjahre besser kontrollieren zu können, als alles, was ich tun kann, dann ist es etwas, woran ich arbeiten werde. –
dieses Beispiel ist jetzt nicht gültig – Anubis
@Anubis: was meinst du mit 'jetzt'? ASP.NET MVC 3? –