【问题标题】:ASP.NET MVC3 - DropDownList Refreshes Model using jQueryASP.NET MVC3 - DropDownList 使用 jQuery 刷新模型
【发布时间】:2011-12-17 00:09:10
【问题描述】:

我有一个下拉列表,更改后应该刷新视图的模型。这是控制器:

    public ActionResult Index()
    {
       //do something totally awesome
    }

    [HttpPost]
    public ActionResult Index(int user)
    {
        //do something even more awesome with the new value selected from the drop down list 
    }

视图的相关部分:

<div id="selectuser" class="user-input">@Html.DropDownListFor(x => x.SelectedUser, Model.Users)</div>

以及处理下拉列表变化的jQuery:

$(function () {
    $('#selectuser select').change(function () {
        $.post('@Url.Action("Index", "Home")', { user: $(this).val() }, function (result) {

        });
    });
});

似乎一切正常,除了 jQuery 部分。显然, UrlAction(...) 是不正确的。当用户更改选择时,这是 MVC 尝试加载的 URL:http://localhost:5555/@Url.Action%28%22Index%22,%20%22Home%22%29

我希望 MVC 在选择更改时路由到控制器中的 HttpPost Index 操作。为什么没有呢?我该如何解决?

在这方面我完全是菜鸟 - 非常感谢您的帮助。

【问题讨论】:

    标签: jquery asp.net-mvc-3


    【解决方案1】:

    这里发生的情况是 Razor 引擎没有评估 @Url.Action()。如果我不得不猜测,我会说生成 JavaScript 代码的东西不在同一个剃刀视图中。如果您还没有,我会先将代码移动到视图页面上的一个块中(如果您还没有的话)。从原始帖子中不清楚 JQuery 代码是否在视图中。

    【讨论】:

    • 就是这样!谢谢你。该脚本在另一个文件中。将脚本移动到视图中的
    • 这很重要,因为 Razor 引擎只能看到通过控制器处理的文件。因此,如果您编写了一个返回 JavaScript 的操作,那将起作用 - 但如果您只有一个普通的 .js 文件,Web 服务器只会将其发送到浏览器,而无需任何额外处理。
    • 我明白了。谢谢你的解释。
    【解决方案2】:

    你试过用ajax回调函数吗?

    $('#selectuser select').change(function () {
       $.ajax({
           url: '@Url.Content("~/Home/Index")',
           type: "POST",
           data: val,
           datatype: "json",
           success: function (data, status, request) {
               // success code here
           },
           error: function (request, status, error) {
               // error code here
           }
        });
    }
    

    下面是一个返回 JSON 的控制器函数(索引)示例:

    [HttpPost]
    public JsonResult Index(int val)
    {
        try
        {
            // do what you need to here
    
            return Json(new
            {
                 // Returning a partial view and success
                 Html = this.RenderPartialView("_PartialView", model),
                 Success = true
            });
        }
        catch (Exception ex)
        { 
            return Json(new
            {
                 // Returning a partial view and and error
                 Html = this.RenderPartialView("_PartialView", model),
                 Success = false
            }, JsonRequestBehavior.AllowGet);
        }
    }
    

    我在下面添加了更多示例,以防您必须使用 ActionResult 而不能使用 JsonResult。

    http://blogs.us.sogeti.com/swilliams/2009/05/11/different-action-results-with-asp-net-mvc-and-jquery/

    http://iridescence.no/post/Invoking-ASPNET-MVC-Actions-from-JavaScript-using-jQuery.aspx

    Return ActionResult to a Dialog. ASP.NET MVC

    【讨论】:

    • 感谢您的回复。我不确定添加 ajax 会有什么帮助。唉,我尝试使用上面的脚本并在我现有的控制器中设置一个永远不会被命中的断点。错误基本相同(HTTP 500),因为这是它试图打开的 URL:localhost:5555/@Url.Content%28%22~/Home/Index%22%29
    • 我认为您在 MVC 3 应用程序中遗漏了一些东西。它不应该那样出来。尝试创建一个新的 MVC 3 应用程序,看看它是否仍然存在。
    • 同意 TIHan,你的 url 没有理由看起来像那样。您的项目中有所有必要的 jquery 引用吗?你有没有在你的 jQuery 中放一个断点来看看它到底在做什么?你的 jQuery 是在 ready 还是 pageLoad 函数中?
    • 另外,我很困惑你为什么使用 div 的 id。您应该尝试在您的下拉列表本身上添加一个 id...例如:@Html.DropDownListFor(x => x.SelectedUser, Model.Users, new {id = "ddlUser"}) 并以此作为参考来获取您的 val并触发你的 jquery
    猜你喜欢
    • 2013-02-14
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-05
    • 2023-03-04
    相关资源
    最近更新 更多