1

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

我将控制器命名为HomeControllerSql Server Database获取数据的位置,为此使用模型实体

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);
    }

}

我有 master.page (命名为 SiteMaster) ,我通过jquery ajax获取这些数据。

<body>
 <div id="header">
   <ul class="classesName"></ul>
 </div>
</body>

<script type="text/javascript">
$(document).ready(function () {
        $.ajax({
            url: "/Home/getClasses",
            type: "GET",
            data: {},
            success: function (result) {
                for (n = 0; n < result.length; n++) {
                    $('.classesName').append('<li><a href="#" onclick="showTypes( \'' + result[n].class_name + '\')" >' + result[n].class_name + '</a></li>');
                }
            }
        });
</script>

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

我想要的只是显示来自 masterPage 的数据getClasses()单击某个Class时,将该参数发送到getTypes(string className)使用javascript使用 @Razor。所以我的问题是我可以这样做吗?怎么做?

4

2 回答 2

2

第一部分(将结果发送getClasses()到您的视图)可以单独使用 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>

对于第二部分(Types点击链接时获取),你不走运。点击必须发生在客户端,所以到那时你的 C# 已经被评估,HTML 被刷新,你的 Razor 运行的时间已经过去了。如果这些类型没有以某种方式缓存在页面上,您将不得不再次向服务器发出请求(而 AJAX 是一种方法)。

于 2013-05-25T13:19:52.283 回答
1

您不需要使用 ajax 来加载初始母版页,只需返回一个包含您需要显示的所有类数据的视图,因为这样可以节省您到服务器的额外行程。至于在单击类时获取数据,这是使用 Ajax 并在 Razor 中执行此操作的理想位置,您将使用许多 @Ajax.xxx 助手之一(@Ajax.RawActionLink、@Ajax.BeginForm 等) . 以下链接可能是开始了解如何在 asp.net MVC视图教程中使用视图的好地方

于 2013-05-25T13:03:15.780 回答