t4mvc actionresult преобразован в строку - PullRequest
0 голосов
/ 15 декабря 2011

Я пытаюсь получить из T4MVC ActionResult выполнить вызов и получить всю строку из статической функции в моем классе EmailService.Любая помощь будет высоко оценена

Ответы [ 3 ]

3 голосов
/ 15 декабря 2011

Я сделал именно эту вещь

 protected virtual string RenderPartialViewToString(string viewName, object model)
    {
        if (string.IsNullOrEmpty(viewName))
            viewName = ControllerContext.RouteData.GetRequiredString("action");

        ViewData.Model = model;

        using (StringWriter sw = new StringWriter())
        {
            ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
            ViewContext viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);
            viewResult.View.Render(viewContext, sw);

            return sw.GetStringBuilder().ToString();
        }
    }

вы бы реализовали это так

string body = RenderPartialViewToString("PasswordChangedEmail");

частичное является только частичным представлением, однако, нет никакой причины, по которой полное представление не может быть использовано. Надеюсь, это поможет.

0 голосов
/ 15 декабря 2011

В случае, если кто-то заинтересован в ответе:

private static RequestContext RequestContext(this HttpContext context)
{
    var httpContextBase = new HttpContextWrapper(context);
    var routeData = new RouteData();
    return new RequestContext(httpContextBase, routeData);
}

private static RouteData GetRoute(this ActionResult url)
{
    var data = url.GetRouteValueDictionary();
    var route = new RouteData();
    foreach (var item in data)
        route.Values[item.Key] = item.Value;
    return route;
}

public static string ExecuteAsString(this T4MVC_ActionResult result)
{
    var controllerName = result.Controller;
    var context = HttpContext.Current.RequestContext();
    context.RouteData = result.GetRoute();
    var controller = (ControllerBase)ControllerBuilder.Current.GetControllerFactory().CreateController(context, controllerName);
    controller.ControllerContext = new ControllerContext(context, controller);
    var htmlHelper = new HtmlHelper(new ViewContext(
                              controller.ControllerContext,
                              new WebFormView(controller.ControllerContext, "HACK"),
                              new ViewDataDictionary(),
                              new TempDataDictionary(),
                              new StringWriter()),
                        new ViewPage());
    return htmlHelper.Action(result).ToString();
}
0 голосов
/ 15 декабря 2011

Вы не сможете использовать T4MVC ActionResults для этого, поскольку они имеют пустую реализацию ExecuteResult().

Я вижу два очевидных способа, которыми вы можете подойти к этому:

1.создать экземпляр контроллера, на котором лежит метод действия, который вы хотите вызвать, и затем вызвать его.Вы можете решить получить экземпляр из ControllerFactory вместо непосредственного создания экземпляра класса, хотя, если вы знаете, какой это тип, я бы пошел с созданием экземпляра экземпляра этого типа напрямую.

, чтобы получить контроллер изфабрика контроллеров по умолчанию, вы можете использовать

 ControllerBuilder.Current.GetControllerFactory().CreateController(RequestContext requestContext, string controllerName);

. Возвращает IController, поэтому вам нужно привести его к правильному типу контроллера, чтобы вызвать метод действия.Проще просто создать его экземпляр напрямую:)

2.Используйте решение для шаблонов электронной почты, например Почтовый , ActionMailer , MvcMailer или Kazi's Модуль шаблонов писем .Все они используют Razor, чтобы вы могли получать красивые шаблоны электронных сообщений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...