当URL进行HTML编码时,为什么我的ViewModel字段为空?

时间:2019-01-27 16:53:05

标签: c# asp.net-mvc

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

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?

1 个答案:

答案 0 :(得分:7)

我认为不是导致问题的原因是您粘贴的代码。 问题可能在其他地方-可能在视图中。

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

我现在所能做的就是为您提供可以在哪里查找错误的指针:

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

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

第二个指针,以查看您在视图中所做的事情

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

您应该首先将断点置于操作方法中,以检查UserName和ActivationToken参数是否均为空。

如果它们不为空,则在分配用户名的位置添加HttpUtility.UrlDecode,如以下代码所示:

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

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

第二个指针通常可以解决您的问题。