컨트롤러에서 HtmlHelper 사용
예를 들어 TextBox (...) 메서드를 가져 오기 위해 컨트롤러에서 HtmlHelper를 사용할 수 있습니까? 직접 생성 한 html을 작성할 수는 없지만 이것이 어떻게 작동하는지 이해하여 최상의 솔루션을 만들 수 있습니다.
여기에서 적응 예입니다 이 :
var h = new HtmlHelper(new ViewContext(ControllerContext, new WebFormView("omg"), new ViewDataDictionary(), new TempDataDictionary()), new ViewPage());
h.TextBox("myname");
이것은 해킹이며 할 수 있지만 이것을 할 합당한 이유가 없다고 생각합니다 ...
다음과 같은 방법을 사용할 수 있습니다.
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();
}
}
HtmlHelper는 설계 상보기 메커니즘의 일부이며 MVC의 컨트롤러 및 모델 부분과 별도로 고려되어야합니다. 렌더링을 위해 데이터를 뷰에 전달하는 것이 역할이기 때문에 컨트롤러 내부에서 컨트롤을 생성하려는 이유를 잘 모르겠습니다.
나는 당신이 그것을 달성 할 수 없다는 것을 말하는 것이 아니라 좋은 디자인을 위해서는 더 좋을 것입니다.
달성하려는 목표를 설명해 주시면 "MVC 방식"으로 수행 할 수 있습니까?
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)
.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);
}
}
}
서비스에 등록해야합니다.
services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
누군가 컨트롤러없이이 작업을 수행하려는 경우 (예 : 단위 테스트시) 이러한 메서드 중 많은 것 (내가 알고있는 테스트 시나리오가 아니라 해당 시나리오에 대해)이 Null을 던지므로 처리해야 할 추가 문제가 있습니다. 예외 ( ViewContext.ScopeCache
). 다음을 통해이를 확인할 수 있습니다 (이 모든 방법을 사용하려면 ViewContext
인스턴스가 형성되어야하며, 이는 HtmlHelper 인스턴스의 생성자에 삽입하는 매개 변수 중 하나입니다.
viewContext.UnobtrusiveJavaScriptEnabled = false;
Simply setting that value throws an exception with many of these methods, but the problem was fixed for me by this answer, see how he gets an HtmlHelper
(see also here).
- using System.Web.Mvc;
using 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());
참고URL : https://stackoverflow.com/questions/621235/using-htmlhelper-in-a-controller
'IT박스' 카테고리의 다른 글
Gather (tidyr)와 용융 (reshape2) 비교 (0) | 2020.11.25 |
---|---|
쿠키 경로 및 하위 폴더 페이지에 대한 액세스 가능성 (0) | 2020.11.25 |
소수점 정밀도 조정, .net (0) | 2020.11.25 |
세트에서 random.choice? (0) | 2020.11.24 |
arduino nano-avrdude : ser_open () : system ca n't open device“\\. \ COM1”: 시스템이 지정된 파일을 찾을 수 없습니다. (0) | 2020.11.24 |