在Controller中使用HtmlHelper

Gil*_*Gil 63 asp.net-mvc

是否可以在控制器中使用HtmlHelper,例如获取TextBox(...)方法?并不是说我不能写自己生成的html,但我只是想了解它是如何工作的,所以我可以创建最好的解决方案.

Mau*_*fer 41

下面是改编自一个例子:

var h = new HtmlHelper(new ViewContext(ControllerContext, new WebFormView("omg"), new ViewDataDictionary(), new TempDataDictionary()), new ViewPage());
h.TextBox("myname");
Run Code Online (Sandbox Code Playgroud)

请注意,这是一个黑客,它可以做,但我认为没有任何理由这样做...

  • 你可以使用'var htmlHelper = new HtmlHelper(new ViewContext(),new ViewPage());' 现在.使用它的一个好理由是产生抗癫痫药.我已经做到这一点,在通过MVC控制器代理的传统asp3.0系统上启用CSRF保护. (18认同)
  • 我认为这不是一件很棒的事情,但是我使用的是使用AJAX的Telerik网格控件,当使用AJAX时,列的ClientTemplate必须是预渲染文本 - 它无法解析对客户的行动.无论如何,这是我的理由.我更喜欢控制器不能以这种方式工作,但是如果我支付的价格比我能做的任何事情都要好,那么这就是我要解决的问题. (3认同)

Vit*_*kov 30

你可以使用这样的方法:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 在mvc 3控制器中使用htmlhelper的好方法是调用Partial方法来呈现视图的html(例如使用razor视图作为模板html电子邮件) (4认同)

Ric*_*ard 8

HtmlHelper是View机制的一部分,应该被视为与MVC的Controller和Model部分分开.我不确定你为什么要在控制器内部生成控件,因为它的作用是将数据传递给视图进行渲染.

我不是说你无法实现它,但是为了好的设计它会更好.

你能解释一下你想要实现的目标,然后我们可以用"MVC方式"来做这件事吗?


Anu*_*bis 5

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)
Run Code Online (Sandbox Code Playgroud)