【问题标题】:How do I fetch data from the database so I can create dynamic elements through javascript?如何从数据库中获取数据,以便通过 javascript 创建动态元素?
【发布时间】:2019-01-19 14:05:35
【问题描述】:

所以我这里有一个看起来有点像这样的模型

public class UserAccount : IdentityUser
    {
        public string Username{ get; set; }
    }

我也有一个看起来像这样的视图

    @model Myproject.ViewModel.TheViewModel
    @{
        ViewData["Title"] = "Welcome";
    }

<div id="theContainer"> <div/>

在该视图中,我想使用 JavaScript 生成一个段落(不是内联,我想使用单独的文件) 所以我创建了一个 js 文件,然后我创建了一个像这样工作的函数。

var container = document.getElementById("theContainer");
var newParagraph= document.createElement("p");

//I could add attributes by doing newParagraph.addAttribute(..)
// but you will read why that is an issue soon

container.appendChild(newParagraph);

如您所见,这将为文档中 ID 为 theContainer 的元素生成一个空段落元素。

这就是问题发生的地方。 我为我的 ASP.NET 项目设置了一个数据库,其中有几个条目。 我想获取这些条目的Username 属性,然后动态生成&lt;p/&gt; 元素。问题是我不知道如何从数据库中获取数据并将其与我的 JavaScript 一起使用。

所以我的问题是,如何从我的数据库中获取数据并使用它来生成元素?

【问题讨论】:

  • 很有趣,你的措辞本身就是答案。有一个Fetch API(它缺少 IE 支持,因此您可能还会考虑使用另一个库,它使用 XmlHttpRequest (AJAX))。然后,您只需要从返回 JSON 的控制器中公开一个操作方法。您可以在 ASP.NET MVC 中执行此操作,但如果您打算做很多,您也可以查看 ASP.NET Web API。您也可以将数据添加到模型中,在视图中将该模型呈现到标记中的隐藏字段,然后使用 JS 从隐藏字段中检索值。
  • 我必须为 Web API 创建一个新项目吗?好像有点过分了吧?
  • 不,您可以在与 MVC 项目相同的项目中托管 Web API。 Web API 只是您安装的 NuGet 包。然后您添加一些配置(以启用到您的 Web API 控制器等的路由),它们将愉快地共存。当然,如果你这样做了,你可能会在某个时候发现,完全不使用 MVC 会更好,而是使用一些前端框架(例如 Vue、React 或 Angular)然后与你的 Web API 对话.但是,如果您愿意,您可以通过将 Web API 添加到现有站点中来涉足其中。
  • 所以 ASP.NET Web API 和 React、Vue 或 Angular.. 嗯.. 可以工作!
  • 当然可以!许多,许多网站都在使用这样的架构。您可以考虑构建站点的“现代”方式。如果你想展望未来(这总是模糊的),那么Blazor 是我最好的猜测。当然,它是实验性的,谁知道它是否会获得市场份额并发展健康生态系统。但它的优点是不需要 JavaScript,并且您可以使用出色的 .NET 语言(例如 C#)进行编码,并且您可以在客户端和服务器端重用您的代码。

标签: javascript c# razor asp.net-core asp.net-core-mvc


【解决方案1】:

您有几个选择。您可以将值嵌入到您的视图中,以便它在标记中呈现。或者你可以让你的 JavaScript 调用你的服务器来检索它。


让我们从将它嵌入到视图中开始。我们假设 Username 是模型的属性。

在你的剃刀中,

@Html.Hidden(m => m.Username)

然后在您的 JavaScript 中,您可以从隐藏的输入中检索值。

var username = document.getElementById("Username").value;

这种技术有一个不幸的优势,就是用很多隐藏场污染你的视图。您可以将整个模型推入 JSON 字符串并将其添加到隐藏字段,但这也很麻烦。


与使用隐藏字段类似,您可以将值直接粘贴到放置在 Razor 视图中的脚本中。

<script>
    var username = '@Model.Username';
</script>

然后您可以从其他脚本中使用该变量。


或者您可以从您的服务器获取值。您可以使用Fetch API(请注意,如果没有 pollyfill,它在 Internet Explorer 中不可用)。假设您在服务器上有一个端点,该端点返回一个 User 模型,其 Username 属性为 JSON。

fetch('/user/1')
  .then(function(response) {
    return response.json();
  })
  .then(function(user) {
    var username = user.Username;
  });

(我可能弄错了语法,我自己没有使用过 Fetch API)


如果您不想使用 Fetch API,您可以使用旧的 XMLHttpRequest API 与您的服务器端进行通信。直接使用 API 很臭(不是超级友好),所以我们经常在它上面使用抽象层,例如 jQuery AJAX。假设与上一个示例相同的服务器端:

$.ajax({
  method: "GET",
  url: "/user/1",
  dataType: "json"
})
.done(function(user) {
  var username = user.Username;
 });

对于您的服务器端,MVC 控制器可以返回 JSON:

public ActionResult User(int id)
{
    var user = userRepository.GetUserById(id);
    return Json(user, JsonRequestBehavior.AllowGet);
}

或者您可以将Web API 安装到您现有的 ASP.NET 项目中(它可以与 MVC 一起使用):

public IHttpActionResult User(int id)
{
    var user = userRepository.GetUserById(id);
    return Ok(username);
}

【讨论】:

  • 例如,如果我开始使用 Vue,我会不会失去像 ASP.NET Core MVC 为角色提供 Identity 之类的功能?
  • @MarkDenom 你在使用 ASP.NET Core MVC 吗?我以为您使用的是非核心,因为您的问题被标记的方式。在这种情况下,MVC 和 Web API 已经结合在一起,您甚至不需要安装单独的包。无论如何,您仍然可以使用 Identity。有几种方法可以解决它。您可以保持基于 MVC 的登录,但让站点的其余部分使用 Vue。或者你可以实现JWT tokens
  • 是的,我正在使用Core 我以为我添加了那个标签,我的错。我认为使用 Hidden 方法会起作用,我将尝试使用它
  • @MarkDenom 该标签将是asp.net-core-mvc。你不会使用 asp.net 标签,你会使用asp.net-core
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-22
  • 2021-11-05
相关资源
最近更新 更多