【问题标题】:JQuery Load using MVC3 @Url.Action does not pass parameters properly使用 MVC3 @Url.Action 的 JQuery 加载未正确传递参数
【发布时间】:2012-10-12 19:53:22
【问题描述】:

我注意到@Url.Action("myAction", new { param1 = 123, param2 = 456}) 为我提供了无效的 URL Home/myAction?param1=123&param2=456

我正在尝试做

$("#myAjaxDiv").load(url);

但只有param1 被填充到操作方法中。

当我删除 & 并将其改为 & 时,它可以工作,但是进行字符串替换是超级 hacky。

url = url.replace("&", "&");

我错过了什么吗?

编辑: 根据请求,我将包含一些示例应用程序。 (您可以创建一个新的 MVC 应用程序并快速添加这些并自己查看)

控制器:

public ActionResult AjaxTest(int? year, int? month)
{
    ViewBag.Message = string.Format("Year: {0}, Month: {1}", year.HasValue ? year.ToString() : "no year", month.HasValue ? month.ToString() : "no month");
    return PartialView("AjaxTest");
}

AjaxTest 视图:

@ViewBag.Message

索引视图:

<script>
    $(function () {
        var url="";
        $("#noParams").click(function () {
            url = "Home/AjaxTest";
            $("#ajaxy").load(url)
            $("#url").text(url);
        });
        $("#yearParam").click(function () {
            url = "Home/AjaxTest?year=2012";
            $("#ajaxy").load(url)
            $("#url").text(url);
        });
        $("#yearAndMonthParam").click(function () {
            url = "Home/AjaxTest?year=2012&month=10";
            $("#ajaxy").load(url)
            $("#url").text(url);
        });

        $("#generated").click(function () {
            url = "@(Url.Action("AjaxTest", new { year=2012, month=10}))";
            $("#ajaxy").load(url);
            $("#url").text(url);
        });

    });
</script>

<a id="noParams" href="#">No Params</a> <br />
<a id="yearParam" href="#">Year Param</a> <br />
<a id="yearAndMonthParam" href="#">Year and Month Param</a> <br />
<a id="generated" href="#">Generated</a> <br />
<div id="ajaxy">

</div>

<div>
URL: <span  id="url"></span>
</div>

【问题讨论】:

标签: ajax asp.net-mvc-3


【解决方案1】:

默认情况下,使用@ 块发出的每个内容(不是IHtmlString)都会由 Razor 自动进行 HTML 编码(请参阅此Razor intro article Html 编码部分)

Url.Action 只返回一个普通的string,所以这就是&amp; 被编码的原因。

如果您不想编码,请使用Html.Raw

url = "@(Html.Raw(Url.Action("AjaxTest", new { year=2012, month=10})))";

【讨论】:

  • 这两种方法都有效,但它们不像我想要的那样干净
  • @NathanKoop 某物是否干净是非常主观的。这就是 Razor 及其编码的工作原理……通常您不直接使用 Url.Action 方法,而是使用负责编码的 Html.BeginFormHtml.ActionLink 助手。
  • 再想一想,这似乎是一个正确的设计决策。将Url.Action 的返回值更改为Type 将要求它的使用者在从C# 类中使用时调用.ToString()(因为Url.Action 可以在Views 和Classes 中使用) ...
【解决方案2】:

你也可以用这种方式构建 url。

var url = "@Url.Action("AjaxTest","YourControllerName")?year=2012&month=10";
$("#ajaxy").load(url);

【讨论】:

  • 这两种方法都有效,但它们不像我想要的那样干净
猜你喜欢
  • 1970-01-01
  • 2014-10-11
  • 1970-01-01
  • 2012-04-19
  • 2014-11-24
  • 2012-07-30
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
相关资源
最近更新 更多