簡體   English   中英

獲取操作的絕對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);
                }
            }

編輯

我正在從AccountControllerResetPassword發布操作中調用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也可以在Controllers中訪問,因此請將該實例提供給您的方法以訪問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");
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM