gpt4 book ai didi

javascript - 如何使用 Javascript 和 Razor 编写干净的代码

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:04:40 25 4
gpt4 key购买 nike

我正在编写一个 ASP.Net MVC 页面,我正在使用来自服务器的数据来创建一个 Google 图表。 x 轴是日期。 y 轴是值。绘制了 2 行数据以进行比较。相关代码如下:

@model IEnumerable<Tuple<DateTime,int,int>>


<div id="chart_div_2" style="width: 900px; height: 500px;"></div>
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
<script type="text/javascript">
google.load("visualization", "1", { packages: ["corechart"] });
google.setOnLoadCallback(drawChart);
function drawChart() {

var arr = [['Year', 'Sales', 'Expenses']];

//Using the Razor Model to create a Javascript array.
var arr2 = [
@foreach(var row in Model)
{
@:["@row.Item1.ToString("MMM d")", @row.Item2, @row.Item3],
}
];

for (var i = 0; i < arr2.length; i++)
{
arr.push(arr2[i]);
}

var data = google.visualization.arrayToDataTable(arr);
var chart = new google.visualization.LineChart(document.getElementById('chart_div_2'));
chart.draw(data);

}
</script>

首先,这段代码确实有效。以这种方式创建 arr2 确实将 Razor 模型变成了我可以使用的东西。但是,我的 Nose 闻到代码味。它说将两种语言 razor 和 Javascript 放在一起,这两种语言在某种程度上类似于基于 C 的编程流程语法,可能会让下一个出现并试图阅读它的人感到困惑。

有没有更好的写法?

最佳答案

However, my nose says code smell.

哦,是的,它很臭,我能感觉到。

Is there a better way to write this?

当然。永远不要像您通过混合两种语言并编写循环和东西那样手动构建 JSON。使用 JSON 序列化程序:

@model IEnumerable<Tuple<DateTime,int,int>>

<div id="chart_div_2" style="width: 900px; height: 500px;"></div>
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
<script type="text/javascript">
google.load("visualization", "1", { packages: ["corechart"] });
google.setOnLoadCallback(drawChart);
function drawChart() {
var arr = @Html.Raw(
Json.Encode(
new object[] { new[] { "Year", "Sales", "Expenses" } }
.Concat(
Model.Select(x => new object[]
{
x.Item1.ToString("MMM d"),
x.Item2,
x.Item3
})
)
)
);

var data = google.visualization.arrayToDataTable(arr);
var chart = new google.visualization.LineChart(document.getElementById('chart_div_2'));
chart.draw(data);
}
</script>

这将生成与您的等效的代码标记,但整个模型操作和编码是在服务器上完成的。您还可以编写一个自定义 HTML 帮助器来简化您的代码:

public static class ChartExtensions
{
public static IHtmlString ToChartData(
this IEnumerable<Tuple<DateTime, int, int>> model,
params string[] titles
)
{
return new HtmlString(
Json.Encode(
new object[] { titles }
.Concat(
model.Select(x => new object[]
{
x.Item1.ToString("MMM d"),
x.Item2,
x.Item3
})
)
)
);
}
}

然后在你看来:

@model IEnumerable<Tuple<DateTime,int,int>>

<div id="chart_div_2" style="width: 900px; height: 500px;"></div>
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
<script type="text/javascript">
google.load("visualization", "1", { packages: ["corechart"] });
google.setOnLoadCallback(drawChart);
function drawChart() {
var arr = @Model.ToChartData("Year", "Sales", "Expenses");
var data = google.visualization.arrayToDataTable(arr);
var chart = new google.visualization.LineChart(document.getElementById('chart_div_2'));
chart.draw(data);
}
</script>

关于javascript - 如何使用 Javascript 和 Razor 编写干净的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12134582/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com