【问题标题】:Url.Action: Passing multiple variablesUrl.Action:传递多个变量
【发布时间】:2015-01-31 23:45:13
【问题描述】:

在阅读了一些其他线程之后,似乎我们需要在 Global.asax.cs 中映射一个新路由,以便传递多个变量。 (注意:如果只传递一个变量就可以了)

但是,如果传递多个变量,第一个变量会通过,而第二个变量(以及之后的任何其他变量)不会通过——它们的值为 null。

例如,_Layout.cshtml 中的 url 值是 var url = '/Home/DidItWork?testUserName=James%20Bond&testEmail=james.bond%40gmail.com'; - 由于 MapRoute 期望以 Home/DidItWork/{testUserName}/{testEmail} 的形式出现,因此该值是否会有所不同?

关于为什么它不传递多个变量的想法或建议?

Global.asax.cs

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        "MyNewRoute",                                              // Route name 
        "Home/DidItWork/{testUserName}/{testEmail}",                           // URL with parameters 
        new { controller = "Home", action = "DidItWork" }  // Parameter defaults
    );

    routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
    );
}

HomeController.cs

public async Task<ActionResult> DidItWork(string testUserName, string testEmail)
{
        var manager = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
        var user = new ApplicationUser { UserName = "user name", Email = "username@gmail.com" };
        var result = await manager.CreateAsync(user, "passwordGoesHere1!");
        if (result.Succeeded)
        {
            await manager.SendEmailAsync(user.Id, testUserName, testEmail);

            return View();
        }
        return View();    
}

_Layout.cshtml

    @*script for someone who presses the send/email button*@ 
<script>
$("#sendButton").click(function () {
    var htmlBody = $("#myModal .modal-body").text();
    var url = '@Url.Action("DidItWork", "Home", new { testUserName = "James Bond", testEmail = "james.bond@gmail.com" })';
    $.ajax({
        url: url,
        success: function (result) {
            alert("Success. It worked." + htmlBody);
        },
        error: function (xhr, status, errorThrown) {
            alert("Sorry, there was a problem! Error: " + errorThrown + ". Status: " + status + ". Console: " + xhr);
            console.log("Hello");
            console.log("Error: " + errorThrown);
            console.log("Status: " + status);
            console.dir(xhr);
            console.log("Good-bye");
        },
    });
    return false;
});
</script>

【问题讨论】:

  • 如果在$.ajax(.. 之前添加console.log(url);,您将看到它生成/Test/DidItWork/James%20Bond/james.bond%40gmail.com 。如果没有,那么您还有其他问题。在任何情况下,由于 url 中的点(来自电子邮件地址),它不会击中控制器。
  • 当我添加 console.log(url) 时它显示/Home/DidItWork?testUserName=James%20Bond&amp;amp;testEmail=james.bond%40gmail.com - 奇怪的是它在只有一个变量时有效,即使是在 console.log(url) 时的 email 变量输出显示/Home/DidItWork?testEmail=james.bond%40gmail.com
  • 我将你的代码粘贴到一个新项目中(我唯一改变的是使用ActionResult instread of async Task&lt;ActionResult&gt; 即public ActionResult DidItWork(string testUserName, string testEmail) 工作正常。它们是你路由表中唯一的路由吗? ?
  • 我收到一个错误Error 1 The 'await' operator can only be used within an async method. Consider marking this method with the 'async' modifier and changing its return type to 'Task&lt;System.Web.Mvc.ActionResult&gt;'.
  • 我显然没有在方法中包含你的代码,只是将方法中的所有代码注释掉并替换为return null;进行测试。无论如何,它有点不清楚你用这段代码做什么 - var htmlBody .. 是什么(你不在任何地方使用它)?为什么要在路线中硬编码值?当你甚至不使用它时,你为什么要返回一个视图?等

标签: jquery ajax asp.net-mvc twitter-bootstrap razor


【解决方案1】:

我怀疑这是一个编码问题。编码 URL 有两种方法:

  • HTML 编码:/Home/DidItWork?testUserName=James%20Bond&amp;amp;testEmail=james.bond%40gmail.com
  • 网址编码:/Home/DidItWork?testUserName=James%20Bond&amp;testEmail=james.bond%40gmail.com

当您将 URL 传递给 Web 服务器时,它应该进行 URL 编码,否则服务器将无法解释查询字符串中的 &amp;amp; 符号。

这可以解释为什么它使用一个变量而不是两个变量。

更新

要创建用于 JavaScript 的不带编码的 URL,您需要将 Url.Action 的输出传递给 Html.Raw。

var url = '@Html.Raw(Url.Action("DidItWork", "Home", new { testUserName = "James Bond", testEmail = "james.bond@gmail.com" }))';

【讨论】:

  • 所以是的,其他人向我解释说,由于我正在使用 javascript 调用操作,因此我不应该使用服务器端视图呈现,例如 Html.Action,而是使用 Url.Action 的客户端脚本 - - Url.Action 是否自动对其进行编码,还是我需要使用您上面提到的 Url Encoding 对其进行专门编码?如果是,那又如何?
  • 太棒了。使用Html.Raw 有效,我现在可以传递多个变量。再次感谢您的解释和反馈。
  • 效果很好!谢谢!现在我可以通过 ajax 传递多个参数了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-24
  • 1970-01-01
  • 2016-11-30
  • 2014-05-13
  • 2015-06-18
相关资源
最近更新 更多