我面临一个奇怪的问题,有时我从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?
答案 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,并将其替换为“ @”字符。
第二个指针通常可以解决您的问题。