C# 如何使用Razor代替jQueryAjax从函数中获取数据

C# 如何使用Razor代替jQueryAjax从函数中获取数据,c#,asp.net-mvc,jquery,asp.net-mvc-4,razor,C#,Asp.net Mvc,Jquery,Asp.net Mvc 4,Razor,我从不在asp.NETMVC中使用Razor,所以我真的不知道它是如何工作的。 每次我想在我的控制器中标记一个函数时,我都会使用jqueryajax,我会编写非常复杂的javascript代码,我的项目非常混乱。 现在我想做些不同的事情 我有一个名为HomeController的控制器,在这里我使用模型实体从SQLServer数据库获取数据 public class HomeController : Controller { public JsonResult getClasses()

我从不在asp.NETMVC中使用Razor,所以我真的不知道它是如何工作的。 每次我想在我的控制器中标记一个函数时,我都会使用jqueryajax,我会编写非常复杂的javascript代码,我的项目非常混乱。 现在我想做些不同的事情

我有一个名为HomeController的控制器,在这里我使用模型实体从SQLServer数据库获取数据

public class HomeController : Controller
{
    public JsonResult getClasses()
    {
        IList<Class> classes = (from x in db.Class select x).Distinct().ToList();
        return Json(classes, JsonRequestBehavior.AllowGet);
    }
    public JsonResult getTypes(string className)
    {
        IList<String> allTypes = (from type in db.Type
                                  where type.class_name == className
                                  orderby type.type_name
                                  select type.type_name).Distinct().ToList();
       return Json(allTypes, JsonRequestBehavior.AllowGet);
    }

}
我有一个名为SiteMaster的master.page,在这里我通过jQueryAjax获取这些数据

我有另一个ajax,用于在单击某个类时获取类型。但所有这些我都想更改,以便可以使用@Razor

我只想将GetClass中的数据显示到母版页中,当单击某个类时,将该参数发送到GetTypessString className中,但不使用javascript和@Razor。
所以我的问题是,我可以这样做吗?如何做?

您不需要使用ajax来加载初始母版页,只需返回一个包含所有需要显示的类数据的视图,这样就可以节省到服务器的额外行程。至于在单击类时获取数据,这是使用Ajax的理想场所,在Razor中,您可以使用@Ajax.xxx helpers@Ajax.RawActionLink、@Ajax.BeginForm等等。。下面的链接可能是了解如何在asp.net MVC中使用视图的好地方

将GetClass的结果发送到视图的第一部分可以单独使用Razor完成,因为所有这些工作都可以在服务器上完成

了解Razor的主要优势是它允许您在视图上执行几乎所有的C操作,这一点很重要。因此,做您想做的事情可以像编写C代码一样简单:

@{
    // I'd suggest you refactor your code to have your `getClasses()` function
    // readily available somewhere that's not a controller
    var classes = Data.getClasses();
}
<div id="header">
    <ul class="classesName">
        @foreach (var clazz in classes) {
            <li>
                <a href="#" onclick="showTypes('@clazz')">@clazz</a>
            </li>
        }
    </ul>
</div>
对于第二部分,当点击链接时获取类型,你就不走运了。点击必须发生在客户机上,因此,到那时,您的C将被评估,HTML将被刷新,运行Razor的时间也将过去。如果这些类型没有以某种方式缓存在页面上,那么您将不得不再次向服务器发出请求,AJAX就是一种方法

@{
    // I'd suggest you refactor your code to have your `getClasses()` function
    // readily available somewhere that's not a controller
    var classes = Data.getClasses();
}
<div id="header">
    <ul class="classesName">
        @foreach (var clazz in classes) {
            <li>
                <a href="#" onclick="showTypes('@clazz')">@clazz</a>
            </li>
        }
    </ul>
</div>