获取操作的绝对值 URL(不在视图中)- NullReferenceException
Get Absolute URL of an Action (not in view) - NullReferenceException
我搜索了很多这个问题,他们似乎都有相同的答案,而且似乎属于由视图而不是控制器调用。
我已尝试实现答案,但我在这部分得到 NullReferenceException
url.RequestContext.HttpContext.Request.Url.Scheme;
我已经引用了 System.Web.Mvc;
但我仍然无法调用 Url.Action
。相反,我必须创建一个 UrlHelper
的新对象,然后调用 Action
方法。我不确定这是否是我的问题的原因。
我的代码如下:
public static class EmailHelper
{
public static string AbsoluteAction(this UrlHelper url, string actionName, string controllerName, object routeValues = null)
{
// Throws NullReferenceException
string scheme = url.RequestContext.HttpContext.Request.Url.Scheme;
return url.Action(actionName, controllerName, routeValues, scheme);
}
public static async Task SendReset(string emailAddress)
{
MailDefinition md = new MailDefinition()
{
IsBodyHtml = true,
Subject = "Password Reset",
BodyFileName = "~/Templates/ResetConfirm.html",
};
UrlHelper helper = new UrlHelper();
string url = helper.AbsoluteAction("Login", "Account");
ListDictionary replacements = new ListDictionary();
replacements.Add("{{LoginUrl}}", url);
MailMessage msg = md.CreateMailMessage(emailAddress, replacements, new System.Web.UI.Control());
SmtpClient client = new SmtpClient();
await client.SendMailAsync(msg);
}
}
编辑
我正在从 AccountController
的 ResetPassword
post 操作中调用 SendReset
public async Task<ActionResult> ResetPassword(ResetPasswordViewModel model)
{
// some code here...
var result = await UserManager.ResetPasswordAsync(user.Id, model.Code, model.Password);
if (result.Succeeded)
{
// Email confirmation of password reset
await EmailHelper.SendReset(model.Email);
return RedirectToAction("ResetPasswordConfirmation", "Account");
}
UrlHelper
属性 Url
也可以在控制器中访问,因此为您的方法提供该实例以访问 UrlHelper
:
public async Task<ActionResult> ResetPassword(ResetPasswordViewModel model)
{
// some code here...
await EmailHelper.SendReset(Url, model.Email);
//...
}
public static class EmailHelper
{
public static async Task SendReset(UrlHelper urlHelper, string emailAddress)
{
//...
string url = urlHelper.AbsoluteAction("Login", "Account");
}
}
我搜索了很多这个问题,他们似乎都有相同的答案,而且似乎属于由视图而不是控制器调用。
我已尝试实现答案,但我在这部分得到 NullReferenceException
url.RequestContext.HttpContext.Request.Url.Scheme;
我已经引用了 System.Web.Mvc;
但我仍然无法调用 Url.Action
。相反,我必须创建一个 UrlHelper
的新对象,然后调用 Action
方法。我不确定这是否是我的问题的原因。
我的代码如下:
public static class EmailHelper
{
public static string AbsoluteAction(this UrlHelper url, string actionName, string controllerName, object routeValues = null)
{
// Throws NullReferenceException
string scheme = url.RequestContext.HttpContext.Request.Url.Scheme;
return url.Action(actionName, controllerName, routeValues, scheme);
}
public static async Task SendReset(string emailAddress)
{
MailDefinition md = new MailDefinition()
{
IsBodyHtml = true,
Subject = "Password Reset",
BodyFileName = "~/Templates/ResetConfirm.html",
};
UrlHelper helper = new UrlHelper();
string url = helper.AbsoluteAction("Login", "Account");
ListDictionary replacements = new ListDictionary();
replacements.Add("{{LoginUrl}}", url);
MailMessage msg = md.CreateMailMessage(emailAddress, replacements, new System.Web.UI.Control());
SmtpClient client = new SmtpClient();
await client.SendMailAsync(msg);
}
}
编辑
我正在从 AccountController
的 ResetPassword
post 操作中调用 SendReset
public async Task<ActionResult> ResetPassword(ResetPasswordViewModel model)
{
// some code here...
var result = await UserManager.ResetPasswordAsync(user.Id, model.Code, model.Password);
if (result.Succeeded)
{
// Email confirmation of password reset
await EmailHelper.SendReset(model.Email);
return RedirectToAction("ResetPasswordConfirmation", "Account");
}
UrlHelper
属性 Url
也可以在控制器中访问,因此为您的方法提供该实例以访问 UrlHelper
:
public async Task<ActionResult> ResetPassword(ResetPasswordViewModel model)
{
// some code here...
await EmailHelper.SendReset(Url, model.Email);
//...
}
public static class EmailHelper
{
public static async Task SendReset(UrlHelper urlHelper, string emailAddress)
{
//...
string url = urlHelper.AbsoluteAction("Login", "Account");
}
}