将数据从 MVC 控制器传递到 Angular 视图而不在最终 html 中显示数据值
Passing data from MVC controller to Angular view without showing the data value in the final html
我正在做一个 MVC+angular 前端项目。在一种情况下,angular 页面将通过 HTTPS GET 请求启动,因此它会显示一个登录页面。在另一种情况下,我们将在 post 数据中获得带有用户名和密码的 HTTPS POST 请求。在这种情况下,我们需要让 MVC 控制器将这些信息传递给 angular 控制器,并以不同的方式启动 angular 页面视图。我阅读了几篇关于如何将数据从 MVC 控制器传递到 angular 控制器、angular 视图的文章。这是我的
MVC 控制器:
public class HomeController : Controller
{
[AcceptVerbs(HttpVerbs.Get | HttpVerbs.Post)]
public ActionResult Index(string name, string password)
{
if (name == null)
{
name = "test";
password = "pass";
}
UserInfoModel infoModel = new UserInfoModel(name, password);
var model = SerializeObject(infoModel);
return View(model);
}
public static IHtmlString SerializeObject(object value)
{
using (var stringWriter = new StringWriter())
using (var jsonWriter = new JsonTextWriter(stringWriter))
{
var serializer = new JsonSerializer
{
// Let's use camelCasing as is common practice in JavaScript
ContractResolver = new CamelCasePropertyNamesContractResolver()
};
// We don't want quotes around object names
jsonWriter.QuoteName = false;
serializer.Serialize(jsonWriter, value);
return new HtmlString(stringWriter.ToString());
}
}
Index.cshtml
<!DOCTYPE html>
<html ng-app="MVCApp" ng-controller="LandingPageController">
<body>
<h1>{{models.username}}</h1>
<script src="//cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.20/angular.min.js"></script>
@Scripts.Render("~/bundles/MVCApp")
@model IHtmlString
<script>
angular.module("MVCApp", []).value("data", @Html.Raw(Model));
</script>
</body>
</html>
Angular 应用程序 MVCApp.js 就像:
var MVCApp = angular.module('MVCApp', []);
MVCApp.controller('LandingPageController', LandingPageController);
Angular 控制器就像:
var LandingPageController = function ($scope, data) {
console.log(data);
$scope.models = {
username: data.userName
};
}
LandingPageController.$inject = ['$scope', 'data'];
当我 运行 它时,我可以看到数据确实传递给了 LandingPageController。但是,如果我查看页面的 html,我会在 html.
中看到以下内容
angular.module("MVCApp", []).value("data", {userName:"test",password:"pass"});
我不会将 html 中的数据(至少某些部分,如密码)设为 visible/readable。
我可以在不让数据在 html 中可见的情况下传递数据吗?
@Html.Raw(Model) 在呈现页面时输出模型的内容。
如果您在页面加载后通过单独的 ajax 调用加载数据(而不是使用 @Html.Raw(Model)),那么通过查看页面源代码将看不到它。
使用 javascript 调试器仍然可以非常容易 找到它,因此这在安全方面绝对没有任何作用。但是,如果有人查看源代码,他们将看不到 JSON 数据的页面。
另一个缺点是您让用户等待更长时间,而不是在首次提供页面时提供初始数据。
此外,我不知道您最终想做什么,但将明文密码传递给浏览器几乎永远不会正确。
我正在做一个 MVC+angular 前端项目。在一种情况下,angular 页面将通过 HTTPS GET 请求启动,因此它会显示一个登录页面。在另一种情况下,我们将在 post 数据中获得带有用户名和密码的 HTTPS POST 请求。在这种情况下,我们需要让 MVC 控制器将这些信息传递给 angular 控制器,并以不同的方式启动 angular 页面视图。我阅读了几篇关于如何将数据从 MVC 控制器传递到 angular 控制器、angular 视图的文章。这是我的
MVC 控制器:
public class HomeController : Controller
{
[AcceptVerbs(HttpVerbs.Get | HttpVerbs.Post)]
public ActionResult Index(string name, string password)
{
if (name == null)
{
name = "test";
password = "pass";
}
UserInfoModel infoModel = new UserInfoModel(name, password);
var model = SerializeObject(infoModel);
return View(model);
}
public static IHtmlString SerializeObject(object value)
{
using (var stringWriter = new StringWriter())
using (var jsonWriter = new JsonTextWriter(stringWriter))
{
var serializer = new JsonSerializer
{
// Let's use camelCasing as is common practice in JavaScript
ContractResolver = new CamelCasePropertyNamesContractResolver()
};
// We don't want quotes around object names
jsonWriter.QuoteName = false;
serializer.Serialize(jsonWriter, value);
return new HtmlString(stringWriter.ToString());
}
}
Index.cshtml
<!DOCTYPE html>
<html ng-app="MVCApp" ng-controller="LandingPageController">
<body>
<h1>{{models.username}}</h1>
<script src="//cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.20/angular.min.js"></script>
@Scripts.Render("~/bundles/MVCApp")
@model IHtmlString
<script>
angular.module("MVCApp", []).value("data", @Html.Raw(Model));
</script>
</body>
</html>
Angular 应用程序 MVCApp.js 就像:
var MVCApp = angular.module('MVCApp', []);
MVCApp.controller('LandingPageController', LandingPageController);
Angular 控制器就像:
var LandingPageController = function ($scope, data) {
console.log(data);
$scope.models = {
username: data.userName
};
}
LandingPageController.$inject = ['$scope', 'data'];
当我 运行 它时,我可以看到数据确实传递给了 LandingPageController。但是,如果我查看页面的 html,我会在 html.
中看到以下内容angular.module("MVCApp", []).value("data", {userName:"test",password:"pass"});
我不会将 html 中的数据(至少某些部分,如密码)设为 visible/readable。
我可以在不让数据在 html 中可见的情况下传递数据吗?
@Html.Raw(Model) 在呈现页面时输出模型的内容。 如果您在页面加载后通过单独的 ajax 调用加载数据(而不是使用 @Html.Raw(Model)),那么通过查看页面源代码将看不到它。
使用 javascript 调试器仍然可以非常容易 找到它,因此这在安全方面绝对没有任何作用。但是,如果有人查看源代码,他们将看不到 JSON 数据的页面。
另一个缺点是您让用户等待更长时间,而不是在首次提供页面时提供初始数据。
此外,我不知道您最终想做什么,但将明文密码传递给浏览器几乎永远不会正确。