Создание файла javascript на лету asp.net mvc
друзья,
Я пытаюсь использовать DyGraph в своем приложении. Пожалуйста, посмотрите на код ниже -
<head>
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7; IE=EmulateIE9">
<title>crosshairs</title>
<script type="text/javascript" src="dygraph-combined.js"></script>
<script type="text/javascript" src="data.js"></script>
</head>
код использует данные.JS-файл, содержащий функцию для получения статических данных. Мне нужны данные.js должен быть сгенерирован с использованием метода контроллера, чтобы он генерировал данные с использованием базы данных.
может кто-нибудь помочь мне решить этот вопрос.
Спасибо, что поделились своим ценным временем.
2 ответов
вы можете определить действие контроллера:
public ActionResult Data()
{
// Obviously this will be dynamically generated
var data = "alert('Hello World');";
return JavaScript(data);
}
и затем:
<script type="text/javascript" src="<%= Url.Action("Data", "SomeController") %>"></script>
если у вас есть какой-то сложный скрипт, который вы не хотите создавать в контроллере, вы можете следовать стандартному шаблону MVC, определив модель представления:
public class MyViewModel
{
... put required properties
}
действие контроллера, которое заполнит эту модель представления и передаст ее в представление:
public ActionResult Data()
{
MyViewModel model = ...
Response.ContentType = "application/javascript";
return PartialView(model);
}
и, наконец, представление, которое в этом случае будет представлением javascript модели представления (~/Views/SomeController/Data.ascx
):
<%@ Control
Language="C#"
Inherits="System.Web.Mvc.ViewUserControl<MyViewModel>" %>
alert(<%= new JavaScriptSerializer().Serialize(Model.Name) %>);
Полное Раскрытие
- этот ответ скопирован с другого вопроса:
- этот ответ похож на другие ответы здесь.
- этот ответ использует
cshtml
страницы, а неascx
управление. - этот ответ предлагает решение только для просмотра, а не только для контроллера решение.
- я не думаю, что мой ответ "лучше", но я думаю, что для некоторых это может быть проще.
- этот ответ использует
динамический CSS в файле CSHTML
я использую комментарии CSS /* */
прокомментировать новый <style>
tag, а затем я return;
перед закрывающим тегом стиль:
/*<style type="text/css">/* */
CSS GOES HERE
@{return;}</style>
динамический JS в файле CSHTML
я использую комментарии JavaScript //
прокомментировать новый <script>
тег а потом я ... --11--> перед закрывающим тегом скрипт:
//<script type="text/javascript">
JAVASCRIPT GOES HERE
@{return;}</script>
MyDynamicCss.cshtml по
@{
var fieldList = new List<string>();
fieldList.Add("field1");
fieldList.Add("field2");
}
/*<style type="text/css">/* */
@foreach (var field in fieldList) {<text>
input[name="@field"]
, select[name="@field"]
{
background-color: #bbb;
color: #6f6f6f;
}
</text>}
@{return;}</style>
MyDynamicJavsScript.cshtml по
@{
var fieldList = new List<string>();
fieldList.Add("field1");
fieldList.Add("field2");
fieldArray = string.Join(",", fieldList);
}
//<script type="text/javascript">
$(document).ready(function () {
var fieldList = "@Html.Raw(fieldArray)";
var fieldArray = fieldList.split(',');
var arrayLength = fieldArray.length;
var selector = '';
for (var i = 0; i < arrayLength; i++) {
var field = fieldArray[i];
selector += (selector == '' ? '' : ',')
+ 'input[name="' + field + '"]'
+ ',select[name="' + field + '"]';
}
$(selector).attr('disabled', 'disabled');
$(selector).addClass('disabled');
});
@{return;}</script>
контроллер не требуется (с помощью Views/Shared)
я поместил оба моих динамических скрипта в Views/Shared/
и я могу легко встроить в любую существующую страницу (или в _Layout.cshtml
), используя следующий код:
<style type="text/css">@Html.Partial("MyDynamicCss")</style>
<script type="text/javascript">@Html.Partial("MyDynamicJavaScript")</script>
использование a Контроллер (опционально)
если вы предпочитаете, вы можете создать контроллер, например,
<link rel="stylesheet" type="text/css" href="@Url.Action("MyDynamicCss", "MyDynamicCode")">
<script type="text/javascript" src="@Url.Action("MyDynamicJavaScript", "MyDynamicCode")"></script>
вот как может выглядеть контроллер
MyDynamicCodeController.cs (необязательно)
[HttpGet]
public ActionResult MyDynamicCss()
{
Response.ContentType = "text/css";
return View();
}
[HttpGet]
public ActionResult MyDynamicJavaScript()
{
Response.ContentType = "application/javascript";
return View();
}
Примечания
- версия контроллера не тестируется. Я только что напечатала это в голове.
- после перечитывания моего ответа мне приходит в голову, что это может быть так же легко комментируйте закрывающие теги, а не используйте cshtml
@{return;}
, но я не пробовала. Полагаю, это вопрос предпочтения. - что касается всего моего ответа, если вы найдете какие-либо синтаксические ошибки или улучшения, пожалуйста, дайте мне знать.