【问题标题】:MVC3 Change View from JqueryMVC3 从 Jquery 更改视图
【发布时间】:2011-06-06 21:20:17
【问题描述】:

我是 MVC3 和 Jquery 的新手。也许我没有采取正确的方法,如果有更好的解决方案,请告诉我。

我想使用 JQuery 来更改我的 MVC 应用程序中的视图。我在主页上有一个产品列表。当用户点击一个产品时,我用 Jquery 向服务器发送一个带有产品 ID 的请求,并切换到产品详细信息视图。在我更改视图之前,我会做 Jquery 爆炸效果。我正在使用 Jquery 效果的回调函数来提交请求。当我调试我的代码时。调用产品详细信息控制器并返回详细信息视图。但是 Web 浏览器不会更改产品详细信息视图。它停留在主页上。

这是我的产品控制器:

public class ProductController : Controller
{

    public ActionResult Details(string productId)
    {
        return View();
    }
}

带有回调的jQuery爆炸效果:

$(".productOriginal").click(function () {
            $(this).hide("explode", {}, 1000, productSelectedCallback);
});

jQuery 回调:

function productSelectedCallback() {
   var prodId = $(this).attr("id");
   var data = { productId: prodId.toString() };
   $(this).load('/Product/Details');
}

除了 .load 之外,我还使用了 .post 和 .ajax 并得到了相同的结果。所以,我必须从根本上错过一些东西。

我正在使用默认注册路由。 products 文件夹的设置与 home 文件夹相同,并且有一个 details.cshtml。

感谢您的帮助!

【问题讨论】:

    标签: jquery asp.net-mvc asp.net-mvc-3 jquery-ui razor


    【解决方案1】:

    试试

    function productSelectedCallback() {
       var prodId = $(this).attr("id");
       var targetUrl = '/Product/Details/' + prodId.toString();
       $(this).load(targetUrl);
    }
    

    编辑:

    更改控制器上的操作方法
    public ActionResult Details(string productId)
    {
        return View();
    }
    

    public ActionResult Details(int id)
    {
        return View();
    }
    

    或您的 jQuery 代码:

    function productSelectedCallback() {
       var prodId = $(this).attr("id");
       var targetUrl = '/Product/Details/?productId=' + prodId.toString();
       $(this).load(targetUrl);
    }
    

    您可能没有路由设置来在您的操作中采用“productId”。您仍然可以使用它(如果您不想配置路由),但它需要在查询字符串中。

    编辑 2:

    鉴于您的最后评论,我不确定您是否真的希望将 AJAX 用于您的解决方案,因为您正试图从一个页面重定向到另一个页面。我建议将您的返回类型更改为 RedirectToAction 结果。这将告诉浏览器您需要重定向,但这需要在您的产品详细信息操作以外的操作中完成(否则您将获得无限的重定向循环)。

    试试这样的:

    // In the home controller where Id = the product id
    public ActionResult RedirectToProductDetails (int id)
    {
        // Use whatever names you want for Id and ProductId, respectively
        return RedirectToAction ("Details", "Products", new { id = id });
    }
    
    // And then in your Product Controller:
    public ActionResult Details (int id)
    {
        var MyProduct = // Get your product from the database or whatever
        return View (MyProduct);
    }
    

    (请注意,这实际上会导致客户端两次旅行,从而有效地消除了使用“AJAX”方法的任何优势。)

    【讨论】:

    • 我得到了同样的结果。当我调试代码时,我可以看到它点击了产品控制器和详细信息操作。它返回视图。我可以右键单击并选择 Go To View 并进入正确的视图。我还可以在 Web 浏览器的 URL 中键入 ...../product/details 并加载正确的页面。
    • 我尝试将产品 ID 完全从图片中删除。 public ActionResult Details() { return View(); } 函数 productSelectedCallback() { var prodId = $(this).attr("id"); var targetUrl = '/产品/详细信息/'; $(this).load(targetUrl); }
    • @Ryand - 发生了什么?您可以在调试模式下运行它并在操作方法处中断并查看它是否被调用?您是否遇到内部错误或任何问题?另外,你是返回 View() 还是 PartialView()?
    • @jdangelo 是的,同样的事情发生了。我确实设置了一个断点。我返回一个 View();还有其他想法吗?谢谢!
    • 我会推荐一个 PartialView(否则你将返回一个完整的网页,而不是你感兴趣的一点点)。尝试在负载处理后显示元素。 $(this).show();另外,我会得到 FireBug 或其他一些 HTTP 检查器,这样你就可以看到你的呼叫出去并在客户端返回。
    【解决方案2】:

    JQuery 回调

    function productSelectedCallback() {
       var prodId = $(this).attr("id");
        var BaseUrl = 'http://' + top.location.host ;
    
        $.ajax({
                    type: 'POST',
                    url: BaseUrl + '/Product/Details',
                    data: ({ productId: prodId.toString() }),
                    success: function (resp) {
    
                    }
                });
    }
    

    CallJquery 带有回调的爆炸效果:

    $(".productOriginal").click(function () {
                $(this).hide("explode", {}, 1000, productSelectedCallback);
    });
    

    这是我的产品控制器:

    public class ProductController : Controller
        {
            [HttpPost] 
            public ActionResult Details(string productId)
            {
                return View();
            }
        }
    

    【讨论】:

    • 我试过了。当我在动作上设置断点时。它击中 actiona 并返回视图。就像负载一样。这是我用来执行 ajax 调用的代码。我能看到的唯一区别是那个 URL,我没有把基础放在它前面。但我认为我的 ajax 调用正在工作,因为它被击中了控制器和操作。
    • 这里是代码 $.ajax({ url: "/Product/Details", type: 'POST', data: JSON.stringify(data), dataType: 'json', contentType: ' application/json, charset=utf-8', async: false, beforeSend: function () { }, success: function (data) { }, error: function () { } });
    • @Ryand.Johnson 这听起来可能是个愚蠢的问题,但是您是否将生成的视图推送到 HTML DOM 中(您是否对视图进行了任何操作?)之后浏览器不会自动执行任何操作一个 AJAX 调用,你得到响应,然后用它做一些事情。
    【解决方案3】:

    您实际上可以通过使用 jquery ajax() 而不是 load() 来实现。在你的控制器上 添加[HttpPost] 接收帖子数据。也就是说,你可以从你的控制器做任何你想做的事情,无论你是想返回视图还是重定向到动作等等。

    【讨论】:

    • 它到达控制器。我在那里设置了一个断点并通过它。它返回一个视图。但是浏览器不会随新页面一起回发。它恢复到原来的样子。我也尝试过使用 httppost 属性的 ajax 路由。同样的事情也会发生。我已经通过它了。
    • 从语义上讲,这没有多大意义。 POST 不应用作 GET。这消除了一些创建内置可扩展性的 HTTP 优点。
    【解决方案4】:

    试试这个: 编辑测试

    $(".productOriginal").click(function (event) {
         event.stopPropagation();
    
         var 
            _this = this,
            prodId = $(this).attr("id"); // is string
    
         alert("Id product: " + prodId);
    
         $(this).hide("explode", 1000,
            function() {
               var data = { productId: prodId };
               $(_this).load('/Product/Details', data, function(responseText){
                    alert("responseText :" + responseText);
               });
            }
         );
    
         return false;
    });
    

    【讨论】:

    • explode 是jquery UI 效果。当我复制你的代码时,我得到了完全相同的结果。唯一的区别是产品图像消失而不是爆炸。
    • 你可以测试代码看看产品代码和结果,看看它是否有效,然后你必须看看将结果发送到哪里。
    【解决方案5】:

    我明白了!感谢@jdangelo。我试图使用错误的工具来解决问题。没有理由向服务器发布任何内容。我已经有一个产品 ID。我可以从客户端重定向。

    代替:

    function productSelectedCallback() {
       var prodId = $(this).attr("id");
       var targetUrl = '/Product/Details/?productId=' + prodId.toString();
       $(this).load(targetUrl);
    }
    

    我用过这个:

    function productSelectedCallback() {
       var prodId = $(this).attr("id");
       var targetUrl = '/Product/Details/?productId=' + prodId.toString();
       top.location.href = targeUrl;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多