c# - 当 url 是 HTML 编码时,为什么我的 ViewModel 字段变为空?

标签 c# asp.net-mvc

我遇到了一个奇怪的问题,有时我从 sendgrid 获取 url 作为

https://localhost:81/Activation?username=ats8@test.com&activationToken=EAAAAA

效果很好。但有时我得到的 url 编码如下,

"https://localhost:81/Activation?username=ats8%40test.com&activationToken=EAAAAA "

我的ViewModel如下,

  public class Verification
    {
        [DataType(DataType.EmailAddress)]
        public string Username { get; set; }

        [Required]
        [DataType(DataType.Password)]
        public string Password { get; set; }

        [Required]
        [DataType(DataType.Password)]
        [Compare("Password")]
        public string ConfirmPassword { get; set; }

        public string ActivationToken { get; set; }

    }

方法如下,

 public ActionResult Activation(string username, string activationToken)
        {
            var model = new Verification
            {
                Username = username,
                ActivationToken = activationToken
            };

            return View(model);
        }

在第二种情况下,activationToken 为空。即使 url 已编码,我如何检测 activationToken?

最佳答案

我相信引起问题的不是您粘贴的有问题的代码。 问题可能在其他地方 - 可能在 View 中。

我已经使用 HTTP 版本/浏览器/.Net/.Net 核心框架的各种组合测试了这段代码,它运行良好。

我现在所能做的就是为您提供有关查找错误的位置的指示:

在模型绑定(bind)中查找的第一个指针

在处理此示例时,我意识到,您的解决方案中的某处可能模型绑定(bind)未正确解码电子邮件“@”字符。
请注意,这仅在您编写了任何自定义逻辑来绑定(bind)值时才适用。 我认为该指针对您有帮助的可能性很小,因为操作的输入参数是原始数据类型。

第二个指针在 View 中查找您正在做什么

我怀疑您在第二个 URL 的情况下正确地获得了用户名和激活 token 。但是,当您发送带有“%40”而不是“@”字符的电子邮件 ID 时,您的 View 无法正确呈现。这会以某种方式导致您的 activationToken 为 NULL。

您应该首先在 action 方法中放置断点,以检查 UserName 和 ActivationToken 参数是否为非空。

如果它们不为空,则在您分配用户名的地方添加 HttpUtility.UrlDecode,如下面的代码所示:

var model = new Verification
{
     Username = HttpUtility.UrlDecode(username),
     ActivationToken = activationCode
};

这将从邮件中删除 %40 并将其替换为“@”字符。

第二个指针主要应该可以解决您的问题。

关于c# - 当 url 是 HTML 编码时,为什么我的 ViewModel 字段变为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54390525/

相关文章:

c# - 从 MySQL 数据库获取图像 - C#

c# - System.reactive跨线程操作荒谬

asp.net-mvc - 在App_Code中的共享@helper中使用@Html

c# - XML 序列化的替代

c# - 网络浏览器、脚本和可能的替代方案

c# - Window.Show() 不显示控件,但 Window.ShowDialog() 显示控件 2

c# - 为什么我可以在 App_Code 中访问 ASP.NET 项目的静态类方法而不是 MVC2 项目?

asp.net-mvc - 使用 Unity 的 MVC5 应用程序中的 ASP.Net Identity 2.1

wpf - 为什么 ASP.NET MVC 仅限于 ASP?

c# - 在 MVC4 中绑定(bind) ListBoxFor 控件时出错