为什么我的ViewModel字段在HTML编码时变为空?

fac*_*urn 7 c# asp.net-mvc

我正面临一个奇怪的问题,有时候我会从sendgrid获取网址

https://开头本地主机:81 /激活username=ats8@test.com&activationToken=EAAAAA

哪个工作正常.但有时我得到的网址编码如下,

" 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; }

    }
Run Code Online (Sandbox Code Playgroud)

方法如下,

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

            return View(model);
        }
Run Code Online (Sandbox Code Playgroud)

在第二种情况下,activationToken为null.即使url被编码,我如何检测activationToken?

Man*_*ari 7

我相信你所粘贴的代码不是导致问题的代码.问题可能出在其他地方 - 可能在视图中.

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

我现在所能做的就是给你指点你可以找到错误的地方:

第一个指向模型绑定的指针

在研究这个示例时,我意识到,在您的解决方案中某处,模型绑定可能无法正确解码电子邮件"@"字符.
请注意,仅当您编写了用于绑定值的任何自定义逻辑时,这才适用.我发现这个指针可以帮助你的概率非常小,因为输入操作参数是原始数据类型.

第二个指针要查看您正在进行的操作

我怀疑你是在第二个URL的情况下适当地获得用户名和激活令牌.但是当您使用"%40"而不是"@"字符发送电子邮件ID时,您的视图无法正常呈现.这会以某种方式导致您的activationToken为NULL.

您应首先在操作方法中放置断点以检查UserName和ActivationToken参数是否为非空.

如果它们非空,则添加HttpUtility.UrlDecode,您将在其中分配用户名,如下面的代码所示:

var model = new Verification
{
     Username = HttpUtility.UrlDecode(username),
     ActivationToken = activationCode
};
Run Code Online (Sandbox Code Playgroud)

这将从邮件中删除%40并将其替换为"@"字符.

第二个指针主要应该解决您的问题.