Исходя из принятого ответа, мой ответ - не то, что вы ищете, но исходя из Google (на момент написания), этот ответ SO наиболее отзывчив на фактическую передачу данных изВид на контроллер.
Если вы установите значение на WebViewPage<T>.ViewContext.ViewData
, оно может быть доступно с контроллера.Мы используем эту технику, чтобы установить тему письма в виде, который мы представляем как тело письма в формате HTML.(Этот подход позволяет нам объединить определение предмета с телом электронного письма и получить доступ к этому предмету из контроллера, куда мы фактически отправляем электронное письмо.)
/// <summary>
/// Sends a system email containing a rendered view.
/// </summary>
public static void SendSystemEmailOfView(this Controller controller, string to, [AspMvcView] string viewName, object model, ViewDataDictionary viewData = null)
{
if (viewData == null)
{
viewData = new ViewDataDictionary();
}
var body = controller.Render(viewName, model, viewData);
object subject;
if (viewData.TryGetValue(WebViewPageExtensions.ViewDataKey_EmailSubject, out subject))
{
subject = subject as string;
}
if (subject == null)
{
subject = DefaultEmailSubject;
}
SendEmail(to, (string)subject, body, isHtml: true);
}
Примечания: 1) AspMvcViewAttribute
это аннотация Resharper, которую вы можете опустить, если не используете Resharper.2) controller.Render
и SendEmail
являются внешними методами (существует много ответов SO о том, как отправлять электронные письма и как вручную отображать представление в строке из контроллера.)
Наше представление выглядит следующим образом:
@model MyViewModel
@{
this.EmailSubject("Subject Here");
}
<p>
Dear Web Forms,
</p>
<p>
I'm leaving you for MVC...it's just so much more...DRY.
</p>
и .EmailSubject
выглядит так:
public const string ViewDataKey_EmailSubject = "MyAppName_EmailSubject";
/// <summary>
/// Sets an email subject in <paramref name="page"/>'s <see cref="WebViewPage{T}.ViewBag"/>. Useful for retrieving the subject from controller.
/// </summary>
public static void EmailSubject<T>(this WebViewPage<T> page, string subject)
{
// Must set value on ViewContext's ViewData if we want to access it after view renders; page.ViewData setter copies the ViewDataDictionary.
page.ViewContext.ViewData[ViewDataKey_EmailSubject] = subject;
}