ASP.NET MVC jQuery加载UserControl尊重命名空间

时间:2009-11-09 19:14:51

标签: jquery asp.net-mvc

我在“/Controllers/Cubo/FilterController.cs”中有控制器的代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;

namespace Mkt.Web.Controllers.Cubo
{
    public class FilterController : Controller
    {
        //
        // GET: /Filter/

        public ActionResult Index()
        {
            return View();
        }

        public ActionResult GetPeople()
        {
            return View("~/Views/Shared/Cubo/Filter/People.ascx");
        }

        public ActionResult GetAddress()
        {
            return View("~/Views/Shared/Cubo/Filter/Address.ascx");
        }

    }
}

使用jQuery调用javascript:

(function($) {
    $.fn.loadFilter = function(name, data, fn) {
        data = (typeof (data) == "undefined") ? {} : data;
        fn = (typeof (fn) == "undefined") ? null : fn;
        $(this).empty();
        $(this).load("/Filter/Get" + name + "", data, fn);
    };
})(jQuery);

$("#containerFilter").loadFilter("People");

但是当我在“FilterController”中调用“GetPeople”时,我需要在没有目录名称“Cube”的情况下调用。 如何调用目录名称以获得更好的订单?。

修改 我需要打电话为“$(this).load("/Cube/Filter/Get" + name + "", data, fn);”。提到“/Controllers/Cubo/FilterController.cs

2 个答案:

答案 0 :(得分:4)

我建议您使用UrlHelper为您的加载操作构建您的网址。这应该使URL相对于当前路径。这假设您的javascript在您的视图中。如果没有,那么我会在你的视图中构建url并将完整的url传递给这个函数。

(function($) {
    $.fn.loadFilter = function(name, data, fn) {
        data = (typeof (data) == "undefined") ? {} : data;
        fn = (typeof (fn) == "undefined") ? null : fn;
        $(this).empty();
        $(this).load( '<%= Url.Action("Get") %>' + name, data, fn);
    };
})(jQuery); 

替代方案 - 基于将javascript保存在单独的文件中。在这种情况下,无法在javascript中使用UrlHelper,您需要修改函数以使用方法的全名来调用它,而不仅仅是合格的部分。

在JS文件中:

(function($) {
    $.fn.loadFilter = function(url, data, fn) {
        data = (typeof (data) == "undefined") ? {} : data;
        fn = (typeof (fn) == "undefined") ? null : fn;
        $(this).empty();
        $(this).load( url, data, fn);
    };
})(jQuery);

在视图中:

$('#people').loadFilter( '<%= Url.Action( "GetPeople" ) %>', null, null );

答案 1 :(得分:-1)

我会在服务器上通过向全局应用程序文件global.asax添加新路由来解决这个问题(如果使用代码分离,则为global.asax.vb或global.asax.cs)。

你会添加这样的新路线:

routes.MapRoute("UserControlRoute", "/Cube/Filter/{action}",new { controller = "FilterController" } ); 

然后将url“/ Cube / Filter / GetPeople”映射到FilterController的GetPeople操作。

您可以选择指定默认控制器,如下所示:

routes.MapRoute("UserControlRoute", "/Cube/Filter/{action}",new { controller = "FilterController", action = "DefaultAction" } ); 

然后会将网址“/ Cube / Filter /”映射到“DefaultAction”操作。

如果您希望“Cube”更改为其他内容,则可以将其设置为参数:

routes.MapRoute("UserControlRoute", "/{cube}/Filter/{action}",new { controller = "FilterController", action = "DefaultAction", cube="DefaultCube" } ); 

在更改此文件中的路由后,您需要重新编译应用程序。 “UserControlRoute”是您要调用路线的任何名称,它们必须是唯一的。

此处有更多信息; http://www.asp.net/learn/mvc/tutorial-23-cs.aspx