【发布时间】:2019-07-16 00:54:42
【问题描述】:
这是我将模型发送到角度控制器范围的方式。
c#控制器:
public class AreaMenuController : RootController
{
// GET: Menu
public PartialViewResult Index()
{
var mod = Modules.Instance.ModuleList.FirstOrDefault(m => m.Prefix.Equals(base.GetArea(), StringComparison.CurrentCultureIgnoreCase));
return PartialView("_AreaMenu", mod.ModuleMenus);
}
}
查看cshtml:
@using Nuclei.Models
@model IEnumerable<Nuclei.Models.Menu>
<script type="text/javascript">
@{ var serializer = new System.Web.Script.Serialization.JavaScriptSerializer(); }
window.areaMenus = @Html.Raw(serializer.Serialize(Model));
</script>
<script type="text/javascript" src="@Url.Content("~/Scripts/AngularControllers/_AreaMenuController.js")"></script>
<div ng-controller="AreaMenuController as vm" ng-init="vm.initializeController()">
<div id="accordion" ng-class="accordian-menu" style="visibility: visible;">
<ul>
<li ng-repeat="menu in vm.areaMenus">
...
</li>
</ul>
</div>
</div>
Angular Js 文件:
var NucleiApp = angular.module('NucleiApp');
NucleiApp.controller('AreaMenuController', ['$scope', '$http', '$location', function ($scope, $http, $location) {
"use strict";
var vm = this;
vm.initializeController = function () {
vm.areaMenus = window.areaMenus;
}
}]);
问题 1:除了通过全局窗口对象之外,有没有更流畅的方式将您的 c# 模型发送到 Angular?
您可以使用 $http 从 angular 获取,但是因为这是在客户端处理的,所以在显示之前总是有一点延迟,因为它需要调用 c# 控制器并获取数据。所以我只保留 $http get 用于更新。
我想的另一种方法是直接向视图发送一个 Json 对象:
c#控制器:
public class AreaMenusController : RootController
{
// GET: Menu
public PartialViewResult Index()
{
return PartialView("_AreaMenu", GetAreaMenus());
}
public JsonResult GetAreaMenus()
{
var mod = Modules.Instance.ModuleList.FirstOrDefault(m => m.Prefix.Equals(base.GetArea(), StringComparison.CurrentCultureIgnoreCase));
return Json(new { areaMenus = mod.ModuleMenus }, JsonRequestBehavior.AllowGet);
}
}
查看cshtml:
@using System.Web.Mvc
@model JsonResult
<script type="text/javascript">
window.areaMenus = @Model;
</script>
问题 2: 我不确定此时如何初始化 @model 并将其发送到 angular 文件,如果有比 javascripts 全局窗口对象更好的选项...欢迎提出建议!
【问题讨论】:
-
Really angular 旨在与 SPA 模型一起使用,您可以通过返回 JSON 的 api 调用从服务器获取所需的一切,而不是通过您在这里使用 razor 进行的那种模板。跨度>
-
我以友好的方式问这个问题。如果是这种情况,您是否发现我在一直加载页面时通过角度呈现内容时所谈论的滞后。实际上,我发现 Angular 对于模板与 razor 和 jquery 组合相比要好得多?而且它非常适合更新您的客户端模型,而不是用于初始加载,这就是我将其混合起来的原因。
-
但是这仍然不能回答初始化剃须刀模型的问题,这正是我现在正在寻找的。span>
-
这就是为什么 Angular 更适合 SPA 的原因 - 正是因为您不会一直重新加载页面。角度的初始加载时间并不重要。所以你只加载一次,之后的一切都只是 JSON API 调用。
-
是的@Hank,我知道我没有回答直接问题。这就是我提供此评论的原因。通常,问题的真正答案是换一种方式思考问题或改变思路。你当然可以在任何地方将 razor 内容注入到 javascript 文件中,当我第一次开始使用 Angular 时,我就是这样做的。从未通过窗口对象。我不知道你为什么觉得有必要。但是,如果您切换到 API 调用而不是页面加载,那么一切都会变得有意义并且运行得更顺畅。不过,我知道过渡是一项重大投资。
标签: c# angularjs json asp.net-mvc model-view-controller