Jquery MVC-为什么对控制器操作参数的Ajax调用总是空的?

Jquery MVC-为什么对控制器操作参数的Ajax调用总是空的?,jquery,asp.net-mvc,asp.net-mvc-4,razor,Jquery,Asp.net Mvc,Asp.net Mvc 4,Razor,我正在使用.get对控制器操作进行Ajax调用,但是当控制器操作启动时,参数始终为null。触发器是我的\u Layout.cshtml中包含的jQuery脚本中的.on(change)事件。我在早些时候发布了这个问题,但是帖子被无关的闲聊弄得一团糟。有人能帮我解决为什么会发生这种情况吗?代码如下: 部分视图:~/Views/Shared/\u LanguageListPartial.cshtml @Html.DropDownListFor( x => x.SelectedLang

我正在使用
.get
对控制器操作进行Ajax调用,但是当控制器操作启动时,参数始终为null。触发器是我的
\u Layout.cshtml
中包含的jQuery脚本中的
.on(change)
事件。我在早些时候发布了这个问题,但是帖子被无关的闲聊弄得一团糟。有人能帮我解决为什么会发生这种情况吗?代码如下:

部分视图:~/Views/Shared/\u LanguageListPartial.cshtml

@Html.DropDownListFor(
    x => x.SelectedLanguage,
    Model.Languages,
    new { @class = "form-control" }
)
<form action="/Account/ListPartial" method="post"
    class="navbar-form navbar-right nopadding" role="" style="margin: 8px 0;">
    @{Html.RenderAction("LanguageListPartial", "Account");} 
</form>

<div id="test"></div>
[AllowAnonymous]
[ChildActionOnly]
public ActionResult LanguageListPartial()
{
    // Retrieve user's language preference. Default = en-US
    string SelectedLanguage = GetLanguage();

    var model = new LanguageListPartialViewModel();

    model.Languages = GetLanguageList();
    model.SelectedLanguage = SelectedLanguage;

    return PartialView("_LanguageListPartial", model);
}
\u Layout.cshtml

@Html.DropDownListFor(
    x => x.SelectedLanguage,
    Model.Languages,
    new { @class = "form-control" }
)
<form action="/Account/ListPartial" method="post"
    class="navbar-form navbar-right nopadding" role="" style="margin: 8px 0;">
    @{Html.RenderAction("LanguageListPartial", "Account");} 
</form>

<div id="test"></div>
[AllowAnonymous]
[ChildActionOnly]
public ActionResult LanguageListPartial()
{
    // Retrieve user's language preference. Default = en-US
    string SelectedLanguage = GetLanguage();

    var model = new LanguageListPartialViewModel();

    model.Languages = GetLanguageList();
    model.SelectedLanguage = SelectedLanguage;

    return PartialView("_LanguageListPartial", model);
}
GET:/Account/TestPartial(针对.on(更改)事件的测试操作)

即使将
pt BR
传递给控制器操作TestPartial,
SelectedLanguage
为空

所以在这一点上,我觉得_Layout.cshtml编码是正确的(包括jQuery)。部分视图代码可以工作并呈现良好的HTML。TestPartial()的问题在于,但我不知道为什么它是错误的:

编辑#2

我发现一个家伙也有同样的ASP.NETMVC问题。他指出,当控制器操作参数的名称与模型成员之一的名称相同时,这个问题发生在他身上。我的参数的名称与相关模型属性的名称相同,但重命名它没有任何区别。这篇文章只是向我暗示,发生这种情况的原因可能真的很模糊

编辑#3


根据@Rune的建议,我更改了参数
id
,因此现在它是
TestPartial(stringid)
。这没有任何区别,因为jQuery脚本调用时,
id
仍然为空。除了
id
之外,我还有其他具有不同参数名称的控制器操作,它们的工作方式与我预期的一样。当我按照@Rune的建议配置路由时,我收到一条错误消息,说找不到TestPartial.cshtml,并显示所有已检查的位置。

我喜欢这样做我的脚本标记-您也可以尝试on事件处理程序主体中的console.log(),以确保所有元素都被正确选择

<script type = "text/javascript" >
    function($){
       $(document).ready(function(){

       });
    })(jQuery);
</script>

函数($){
$(文档).ready(函数(){
});
})(jQuery);

您需要配置路由以捕获所选语言。差不多

routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{selectedLanguage}",
                defaults: new { controller = "Home", action = "Index", selectedLanguage = "en-US" }
            );
中心问题是:您必须以某种方式告诉ASP.NET MVC,您希望URL的最后一部分与
selectedLanguage
参数相关联-MVC自己怎么能猜到

或者,如果您具有默认管线设置

routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
您必须更改操作以使用
id
参数

ActionResult TestPartial(string id) { }

您的代码正在工作,是的,事件已触发,请查看我的编辑。您是否将路由配置为与“selectedLanguage”参数匹配?类似于“{controller}/{action}/{selectedLanguage}”的东西?我有其他工作正常的控制器操作。我的控制器操作配置与此类似-它们接受国家代码,如“USA”或“CAN”。在你的例子中,我认为{selectedLanguage}只是一个占位符?我的意思是,它不必按字面来命名,是吗?如果是这样的话,那么一个应用程序需要很多路由。{controller}/{action}/{id}不够吗?{id}可以是任何东西-一个数字,一个字符串?我只是猜测。我将参数更改为
字符串id
,但它仍然为空。我将阅读更多关于您所说的内容,因为我不知道参数名称必须与您所说的匹配。我假设路由是关于结构的,在本例中,我认为它遵守了默认路由配置。我在途中收到的一个响应建议我尝试使用jQuery。开始打这个电话。我做了那个改动,并认为这是一个好代码。结果我把它留在了原处。刚才我回到了jQuery调用的原始实现,它使用参数名作为id!为了测试将参数名称从selectedlanguage更改为id是否与成功有关,我将参数重新命名为selectedlanguage,并返回null。你是对的!非常感谢你
ActionResult TestPartial(string id) { }