Как выполнить функцию JavaScript при загрузке PartialView в MVC 3
\\code
public ActionResult mapPartial(DataTable dt)
{
string strEvents = "[";
foreach (DataRow row in dt.Rows)
{
strEvents += "[" + row["Lat"].ToString() + ", " + row["Long"].ToString() + ", " + "\"" +
row["LastName"].ToString() + row["DateOfBirth"].ToString() + "\"" + "],";
}
strEvents = strEvents.Remove(strEvents.LastIndexOf(","));
strEvents += "]";
ViewBag.locpoints = strEvents;
return PartialView(dt);
}
//in the partial view page
<script type="text/javascript">
function mapInit(Viewbag.locpoints) {
var arr = $.parseJSON(Viewbag.locpoints);
//more code which assigns a map to div map below
}
</script>
<div id="map" class="map"></div>
Как я могу сразу вызвать функцию JS для рендеринга моей карты при загрузке частичного представления. Частичный метод в контроллере возвращает строку, которая используется как параметр в функции JS. Надеюсь, это имеет смысл.
Ответы
Ответ 1
Поскольку вы, кажется, используете JQuery, почему бы и нет:
<script type="text/javascript">
$(document).ready(function(){
var arr = $.parseJSON("@Viewbag.locpoints");
//more code which assigns a map to div map below
});
</script>
Я также изменил то, как вы ссылались на свое значение ViewBag
, так как оно у вас есть, это не будет строковым литералом в JavaScript.
Кроме того, в качестве дополнительной заметки рассмотрим использование JSON-сериализатора для преобразования ваших данных в JSON. Это считается плохой практикой делать это вручную, как вы делали это выше.
Ответ 2
После того, как вы определите его, вы просто вызываете его. Однако похоже, что вы включаете значения MVC Viewbag в определение функции JS. Вы должны передавать эти значения при вызове метода JS:
<script type="text/javascript">
function mapInit(locPoints) {
var arr = $.parseJSON(locPoints);
//more code which assigns a map to div map below
}
mapInit(@(Viewbag.locpoints));
</script>
Примечание. Предполагается, что вы загрузили jQuery.
Ответ 3
Попробуйте вызвать контроллер через JQuery.
$(document).ready(function () {
$.ajax({
type: 'GET',
url: 'your_controller_url',
success: function (data) {
//Do your stuffs here
}
});
}
Ответ 4
Рассмотрите возможность использования опции onSuccess Ajax и подключите функцию javascript, где написан ваш jquery. Например, у вас есть следующий script, написанный в вашем mainView, который вызывает частичный вид. Предположим, вы хотите что-то сделать, когда щелкнуть тег привязки в вашем частичном представлении
var fromPartial=function()
{
var v = $(this).closest("div");
var mId = v.attr('id');
if (mId == 'divDetail') {
event.preventDefault();
//what you want to achieve
}
}
Теперь в вашем частичном представлении тег привязки создается, как показано ниже.
@Ajax.ActionLink("Select", "AssignSpeaker", new {
conferenceId = ViewBag.ConferenceId, sessionId = session.Id },
new AjaxOptions() { HttpMethod="Get",
InsertionMode= InsertionMode.Replace, UpdateTargetId="yourTarget",
OnSuccess="fromPartial" })
Ответ 5
Мы реализовали гораздо более простое решение.
_Layout.cshtml после @RenderSection("scripts", required: false)
(и JQuery и т.д.)
<script>
$(document).ready(function () { if (typeof partialScript !== "undefined") partialScript();});
</script>
Затем в вашем частичном представлении:
<script type="text/javascript">
function partialScript() {
alert("hi");
}
</script>
Это обеспечивает следующее:
- загружается jQuery
- Загружаются все сценарии основного вида.
- DOM готов
Ответ 6
На всякий случай кто-то снова натыкается на это (и поскольку нет заметного ответа)... Вы не можете определить Javascript в частичном представлении, как указано в this Дарин.
Ответ 7
Единственный способ сделать это - вызвать действие контроллера с помощью JQuery и вернуть его частичное представление. Используйте JQuery для обновления любого раздела страницы, на котором выполняется частичный просмотр, а затем вызывают метод javascript, который вы хотите отобразить на карте.