我遇到了一个奇怪的问题,有时我从 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/