2017-07-25 81 views
0

我需要創建全局網址併發送至電子郵件。我創建全球網址感謝url.action但url.action返回我空。我不知道爲什麼。有誰知道? 我的方法:Url action null object asp.net mvc

public string sendRecoveryMessage(Users userModel) 
    { 
     MessageModel message = new MessageModel(); 

     string resetLink = "<a href='" 
        + Url.Action("SetNewPassword", "Home", new { TimeLink = userModel.TimeLink }, "http") 
        + "'>Ссылка для восстановления пароля</a>"; 

     message.emailTo = userModel.Email; 
     message.emailFrom = "[email protected]"; 
     message.title = "Восстановление пароля"; 
     message.message = resetLink; 

     string responseToString = SendMessage(message); 

     try 
     { 
      RootObject r = JsonConvert.DeserializeObject<RootObject>(responseToString); 
      return r.msg + "Для продолжения изменения пароля пройдите по ссылке указаной в письме. У вас есть сутки на изменение вашего пароля!"; 
     } 
     catch (Exception) 
     { 
      return responseToString; 
     } 
    } 

和路由:

public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     //Defaulf route 
     routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 
    } 

和恢復密碼的方法:

public ActionResult SetNewPassword(string TimeLink) 
    { 
     var recEmailDetails = dbModel.Users.Where(x => x.TimeLink == TimeLink).FirstOrDefault(); 

     if (recEmailDetails == null) 
     { 
      ViewBag.RedirectMessage = "Данная ссылка больше не активна!"; 
      return View("~/Views/Home/RedirectPage.cshtml"); 
     } 

     DateTime dateNow = Convert.ToDateTime(DateTime.Now); 
     DateTime dateConfirm = Convert.ToDateTime(recEmailDetails.DateTime); 

     TimeSpan diff = dateConfirm - dateNow; 

     var TotalSeconds = Math.Floor(diff.TotalSeconds); 

     TotalSeconds += 86400; 

     if (TotalSeconds < 0) 
     { 
      ViewBag.RedirectMessage = "Время действия ссылки истекло. Нам очень жаль :C"; 
      return View("~/Views/Home/RedirectPage.cshtml"); 
     } 
     else 
     { 
      Session["idResetUser"] = recEmailDetails.Id; 

      ChangePasswordModel CPM = new ChangePasswordModel(); 

      try 
      { 
       recEmailDetails.DateTime = null; 
       recEmailDetails.TimeLink = null; 

       dbModel.SaveChanges(); 
       ModelState.Clear(); 
      } 
      catch (DbEntityValidationException exc) 
      { 
       foreach (var entityValidationErrors in exc.EntityValidationErrors) 
       { 
        foreach (var validationError in entityValidationErrors.ValidationErrors) 
        { 
         ViewBag.RedirectMessage = exc.Message; 
        } 
       } 
      } 

      return View("~/Views/Home/SetNewPassword.cshtml", CPM); 
     } 
    } 
+2

什麼是「全局URL」? – mason

+0

因爲這個網站將被移動到託管和恢復鏈接將被改變。我需要dinamyc創建鏈接才能訪問操作。因爲如果我寫本地主機:1111/SetNewPassword/TimeLink?blablabla它不起作用的託管。 – Zicise

+0

那麼?使用當前URL獲取主機名,或者在應用程序的配置中對其進行硬編碼。 – mason

回答

0

嘗試這樣的 -

string resetLink = "<a href='" + Url.Action("SetNewPassword", "Home", new System.Web.Routing.RouteValueDictionary(new { TimeLink = userModel.TimeLink }), "http", , Request.Url.Host) + "'>Ссылка для восстановления пароля</a>"; 
+0

返回null。 :C – Zicise

0

Url.Action是怎麼回事呈現關聯給服務器,而不是給閱讀電子郵件的客戶。全球URL,你的意思是絕對URL,你可以只定義根URL手動像:

"http://somewhere.com" + Url.Action(...) 

我想這應該呈現正確的URL;預覽它只是爲了確保。如果您的應用程序是根目錄下的虛擬目錄,請將其添加到根網址。另外,我看到了對SendMessage的調用;確保沒有任何內容導致消息無法正確呈現(因爲這似乎是您的自定義實現?)