在MVC中使用Ajax将数据传输到视图时,是否需要通过控制器?

时间:2011-11-11 08:11:06

标签: asp.net-mvc asp.net-mvc-3

在我的javascript代码中,我有以下内容:

function SelectTopics() {
    $.ajax({
        url: "/Administration/Loc/SelectTopics",
        data: { DataSourceID: $('#DataSourceID').val(),
            LocationID: $('#LocationID').val()
        },
        success: function (data) {
            $('#TopicID').html(data);
            $('#SubTopicID').html("<option value='00'>All Sub Topics</option>");
        }
    });
}

在我的控制器代码中,我有:

    public string SelectTopics(string dataSourceID, string locationID)
    {
        return Select.Topics(
            dataSourceID, 
            locationID);
    }

在Select类中,我有以下内容:

    public static string Topics(string dataSourceID, string locationID)
    {
        ...
        return text;
    }

控制器只是通过一个请求,我的控制器代码随着所有这些请求变得越来越大。还有另一种更常规的方法是将数据从数据源导入视图而不必每次都通过控制器吗?

1 个答案:

答案 0 :(得分:1)

MVC肯定需要Controller类来处理所有请求。如果没有继承Select,我就不能简单地公开Controller类。但是,可能有一种方法可以最大限度地减少控制器中“传递冗余”的数量。

简单反思

如果您的方法采用相同的参数,您可以使用反射和巧妙的路由来获得您正在寻找的结果。

例如,网址/Administration/Loc/Select/Topics?dataSourceId=x&locationId=y可以/Administration/{Controller}/{Action}/{Method}路由到:

public ActionResult Select(string method, string dataSourceID, string locationID) {
    var methodInfo = typeof(Select).GetMethod(method);
    return methodInfo.Invoke(dataSourceID, locationID);
}

MVC路由

如果方法采用不同的参数,那么使用反射将输入映射到参数将非常繁琐。 MVC框架的很大一部分在路由中。从请求到Action方法的映射做了很多反思,重新创建这个功能会非常繁琐。

可能使用MVC路由引擎将请求传递给控制器​​。这可能是一个很好的解决方案,但它肯定需要比我有时间更多的研究,抱歉。然而,好消息是MVC是开源的,所以你绝对可以看到他们是如何做到的!