【发布时间】:2017-12-31 11:27:53
【问题描述】:
我需要创建全局 url 并发送到电子邮件。由于 url.action 我创建了全局 url,但 url.action 返回 Me null。我不知道为什么。有谁知道? 我有方法:
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 = "Narkom@info.by";
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);
}
}
【问题讨论】:
-
什么是“全局 URL”?
-
因为这个站点将被移动到托管和恢复链接将被更改。我需要 dinamyc 创建链接以访问操作。因为如果我写 localhost:1111/SetNewPassword/TimeLink?blablabla 它在托管中不起作用。
-
所以?使用当前 URL 获取主机名,或在应用程序的配置中对其进行硬编码。
-
你不明白。我需要为操作创建链接。我不能使用你的变种。而且我不知道将来的服务器(托管)是什么。此链接必须是通用的。
-
我明白。您想要一个链接到您的网站。我已经用两种技术来创建这样的链接。
标签: c# asp.net asp.net-mvc url url.action