我正面临一个奇怪的问题,有时候我会从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?
我相信你所粘贴的代码不是导致问题的代码.问题可能出在其他地方 - 可能在视图中.
我已经使用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并将其替换为"@"字符.
第二个指针主要应该解决您的问题.