C# 获取操作的绝对URL(不在视图中)-NullReferenceException
我已经搜索了很多这个问题,它们似乎都有相同的答案,似乎是由视图而不是控制器调用的 我已经尝试实现了答案,但是在这一部分我得到了一个C# 获取操作的绝对URL(不在视图中)-NullReferenceException,c#,.net,asp.net-mvc,url-routing,C#,.net,Asp.net Mvc,Url Routing,我已经搜索了很多这个问题,它们似乎都有相同的答案,似乎是由视图而不是控制器调用的 我已经尝试实现了答案,但是在这一部分我得到了一个NullReferenceExceptionurl.RequestContext.HttpContext.Request.url.Scheme 我参考了System.Web.Mvc但我仍然无法调用Url.Action。相反,我必须创建一个新的UrlHelper对象,然后调用Action方法。我不确定这是否是我的问题的原因 我的代码如下: public stat
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");
}
公共异步任务ResetPassword(ResetPasswordViewModel模型)
{
//这里有一些代码。。。
var result=await UserManager.ResetPasswordAsync(user.Id、model.Code、model.Password);
if(result.successed)
{
//密码重置的电子邮件确认
等待EmailHelper.SendReset(model.Email);
返回重定向操作(“重置密码确认”、“帐户”);
}
控制器中也可以访问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");
}
}
公共异步任务ResetPassword(ResetPasswordViewModel模型)
{
//这里有一些代码。。。
等待EmailHelper.SendReset(Url,model.Email);
//...
}
公共静态类EmailHelper
{
公共静态异步任务SendReset(UrlHelper UrlHelper,字符串emailAddress)
{
//...
字符串url=urlHelper.AbsoluteAction(“登录”、“帐户”);
}
}
你不能仅仅新建一个UrlHelper
并期望它以与视图中相同的方式工作。正如你所说,你会在HttpContext
之类的东西上得到空引用-在静态参考框架中,HttpContext
的值是多少?没有,只有在请求/响应周期结束时,HttpContext
才存在正在发生。如果您想调用SendReset
,您应该从MVC框架初始化的控制器的视图或实例中提供UrlHelper
。您是否应该从中调用SendReset
代码?我们可以帮助您找到更好的方法来获取UrlHelper
对象以提供判定元件it@DLeh我编辑了我的帖子,以包含调用SendReset
的代码。我是否必须在SendReset
中将登录页面的URL作为参数传递?这似乎是不必要的,因为参数总是相同的