Asp.net mvc callbackUrl正在更改?使用%3f

Asp.net mvc callbackUrl正在更改?使用%3f,asp.net-mvc,Asp.net Mvc,我正在做一个项目,遇到了一个奇怪的问题, 我生成一个回调URL,该URL进入确认电子邮件,以激活已注册的帐户: var callbackUrl = Url.Action("registerconfirmation", "account", new { Id = "?" + confirmationToken }, protocol: Request.Url.Scheme); 问题是它生成了以下url: 如你所见,它似乎取代了?对于%3f,我希望这与html编码有关。 我试着加上这个?但这给了

我正在做一个项目,遇到了一个奇怪的问题, 我生成一个回调URL,该URL进入确认电子邮件,以激活已注册的帐户:

var callbackUrl = Url.Action("registerconfirmation", "account", new { Id = "?" + confirmationToken }, protocol: Request.Url.Scheme);
问题是它生成了以下url:

如你所见,它似乎取代了?对于%3f,我希望这与html编码有关。 我试着加上这个?但这给了我同样的结果

我目前正在使用ActionMailer软件包,以尽量减少控制器中的代码,当收到电子邮件时,它似乎没有正确解码callbackUrl,而当我的注册HttpPost中直接有电子邮件逻辑时,它解码得很好

EmailController:

    public class EmailController : MailerBase
    {
                public EmailResult ConfirmationEmail(Register model, string callbackUrl)
                {
                    From = "donotreply@kevindefrene.me";
                    To.Add(model.Email);
                    Subject = ("Email Confirmation");
                    ViewBag.Url = callbackUrl;
                    return Email("ConfirmationMessage", model);
                }
    }
    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public ActionResult Register(Register model)
    {
        string confirmationToken = CreateGuid();
        Account account = new Account(model.Username, model.Password, model.FirstName, model.LastName, model.Email, false, confirmationToken);
        Session["accountID"] = Repository.InsertAccount(new Account(model.Username, model.Password, model.FirstName, model.LastName, model.Email, false, confirmationToken));
        var callbackUrl = Url.Action("registerconfirmation", "account", new { Id = "?" + confirmationToken }, protocol: Request.Url.Scheme);
        try
        {
            new EmailController().ConfirmationEmail(model, callbackUrl).Deliver();
        }
        catch (Exception e)
        {
            ModelState.AddModelError("ConfirmationMailFailed", "Problem sending email" + e.Message);
        }
        return View("emailconfirmation");
    }
注册表控制器:

    public class EmailController : MailerBase
    {
                public EmailResult ConfirmationEmail(Register model, string callbackUrl)
                {
                    From = "donotreply@kevindefrene.me";
                    To.Add(model.Email);
                    Subject = ("Email Confirmation");
                    ViewBag.Url = callbackUrl;
                    return Email("ConfirmationMessage", model);
                }
    }
    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public ActionResult Register(Register model)
    {
        string confirmationToken = CreateGuid();
        Account account = new Account(model.Username, model.Password, model.FirstName, model.LastName, model.Email, false, confirmationToken);
        Session["accountID"] = Repository.InsertAccount(new Account(model.Username, model.Password, model.FirstName, model.LastName, model.Email, false, confirmationToken));
        var callbackUrl = Url.Action("registerconfirmation", "account", new { Id = "?" + confirmationToken }, protocol: Request.Url.Scheme);
        try
        {
            new EmailController().ConfirmationEmail(model, callbackUrl).Deliver();
        }
        catch (Exception e)
        {
            ModelState.AddModelError("ConfirmationMailFailed", "Problem sending email" + e.Message);
        }
        return View("emailconfirmation");
    }
电子邮件视图:

<p>To get started, please click <a href="@ViewBag.Url">here</a> to activate your account.</p>
要开始,请单击激活您的帐户


当您使用
Url.Action(“A”,“B”,new{A=“x”})
时,它会自动创建类似“/B/A?A=x”的查询字符串。所以你不需要添加这个?在那里做标记。有关更多相关信息,请查看参考。

删除“?”。使用以下代码:

var callbackUrl = Url.Action("registerconfirmation", "account", new { Id = confirmationToken }, protocol: Request.Url.Scheme);

所以你的url应该是-

删除“?”。试试这个-var callbackUrl=Url.Action(“registerconfirmation”,“account”,new{Id=confirmationToken},protocol:Request.Url.Scheme);因此,您的url将被添加为答案,以便其他人无需通过评论就能清楚地看到。