在控制器中使用HtmlHelper

是否有可能在控制器中使用HtmlHelper,例如获取TextBox(…)方法? 不是我不能写自己生成的html,但我只是想了解这是如何工作的,所以我可以创build最好的解决scheme。

提前致谢!

这里有一个例子适应这个 :

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是Viewdevise的一部分,应该被视为与MVC的Controller和Model部分分开。 我不知道为什么你想要在控制器内部生成控件,因为它的作用是将数据传递到视图进行渲染。

我不是说你不能达到目标,而是为了好的devise,这样会更好。

你能解释一下你正在努力实现什么,然后我们可以用“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) 

如果有人试图从没有控制器(如unit testing)这样做,还有更多的问题需要处理,因为许多这些方法(我知道,这不是一个testing场景,但在这种情况下)投掷空exception( ViewContext.ScopeCache )。 你可以通过下面的方式看到这个(注意所有这些方法都需要一个ViewContext实例的形成,这是你插入到HtmlHelper实例的构造函数中的一个参数,所以在那个对象上):

 viewContext.UnobtrusiveJavaScriptEnabled = false; 

简单的设置这个值就会抛出一个exception,但是这个问题已经被我解决了 ,看看他是如何得到一个HtmlHelper (参见这里 )。

  • 使用System.Web.Mvc;
  • 使用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());