Url.Action:传递多个变量

时间:2015-01-31 23:45:13

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

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

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

作为一个例子,_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>

1 个答案:

答案 0 :(得分:8)

我怀疑这是一个编码问题。有两种方法可以对URL进行编码:

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

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

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

<强>更新

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

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