【问题标题】:Url action null object asp.net mvcurl 动作空对象 asp.net mvc
【发布时间】: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


【解决方案1】:

试试这样 -

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

【讨论】:

  • 返回空值。 :C
【解决方案2】:

Url.Action 将相对于服务器呈现,而不是相对于阅读电子邮件的客户端。全局 URL 是指绝对 URL,您可以手动定义根 URL,例如:

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

我认为应该呈现正确的 URL;预览它只是为了确定。如果您的应用是根目录下的虚拟目录,请将其添加到根 URL。另外,我看到了对 SendMessage 的调用;确保其中没有任何内容导致消息无法正确呈现(因为这似乎是您的自定义实现?)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-09
    • 1970-01-01
    • 1970-01-01
    • 2012-08-04
    • 1970-01-01
    • 2017-03-12
    • 1970-01-01
    相关资源
    最近更新 更多