2017-07-25 3 views
0

グローバルURLを作成して電子メールで送信する必要があります。私はurl.actionにグローバルなURLを作成しますが、url.actionはnullを返します。そして私は理由を知らない。誰でも知っていますか? 私は方法があります。URLアクションnullオブジェクト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

このサイトはホスティングサイトに移動され、リカバリリンクが変更されるためです。行動へのアクセスのためにリンクを作成する必要があります。なぜなら、私がlocalhost: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を表示する必要があります。確認のためだけにプレビューしてください。アプリがルートの下にある仮想ディレクトリの場合は、ルートURLに追加します。また、私はSendMessageの呼び出しを参照してください。メッセージが正しく表示されない(カスタム実装のように見えるので、何も表示されないようにしてください)

関連する問題