Ajax-вызов не работает в asp.mvc - PullRequest
0 голосов
/ 04 марта 2012

У меня есть этот метод в моем контроллере.

 public string GetTime(string zone)
    {
        DateTime time = DateTime.UtcNow.AddHours(offsets[zone]);
        return string.Format("<div>The time in {0} is {1:h:MM:ss tt}</div>", zone.ToUpper(), time);
    }

    private Dictionary<string, int> offsets = new Dictionary<string, int> { { "utc", 0 }, { "bst", 1 }, { "mdt", -6 }};

Это мой HTML:

@{
    ViewBag.Title = "Statistics";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<html>
<head runat="server">
    <script src="@Url.Content("~/Scripts/MicrosoftAjax.js")"
    type="text/javascript"></script>
    <script src="@Url.Content("~/Scripts/MicrosoftMvcAjax.js")" 
    type="text/javascript"></script>
</head>
<body>
    <h2>
        Statistics</h2>
    <h2>
        What time is it?</h2>
    <p>
        Show me the time in:<br />
        @Ajax.ActionLink("UTC", "GetTime", new { zone = "utc" }, new AjaxOptions { UpdateTargetId = "myResults" })<br />
        @Ajax.ActionLink("BST", "GetTime", new { zone = "bst" }, new AjaxOptions { UpdateTargetId = "myResults" })
        <br />
        @Ajax.ActionLink("MDT", "GetTime", new { zone = "mdt" }, new AjaxOptions { UpdateTargetId = "myResults" })
        <br />
    </p>
    <div id="myResults" style="border: 2px dotted red; padding: .5em;">
        Results will appear here
    </div>
    <p>
        This page was generated at @DateTime.UtcNow.ToString("h:MM:ss tt") (UTC)
    </p>
</body>
</html>

Проблема в том, что время не появляется в элементе div .. новремя, представленное на пустой странице (имеется в виду обратный вызов вместо вызова ajax).Почему это происходит?

Вот как выглядит HTML загруженных ссылок:

    <script src="../../Scripts/jquery-1.5.1-vsdoc.js" type="text/javascript"></script>

<script src="/Scripts/jquery.unobtrusive-ajax.js" type="text/javascript"></script> 

<script src="/Scripts/MicrosoftAjax.js" type="text/javascript"></script>

<script src="/Scripts/MicrosoftMvcAjax.js" type="text/javascript"></script>

Ответы [ 2 ]

1 голос
/ 04 марта 2012

Вы включили макет, но, по вашему мнению, у вас есть весь документ <html>, и я полагаю, что в конце вы получите очень испорченный HTML.

Вот как может выглядеть ваше представление, если вы не хотите использовать макет:

@{
    ViewBag.Title = "Statistics";
    // Explicitly specify that we don't use any layout because
    // this view already contains the entire html document
    Layout = null;
}

<html>
<head>
    <script src="@Url.Content("~/Scripts/jquery-1.5.1.js")" type="text/javascript"></script>
    <script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.js")" type="text/javascript"></script>
</head>
<body>
    <h2>
        Statistics</h2>
    <h2>
        What time is it?</h2>
    <p>
        Show me the time in:<br />
        @Ajax.ActionLink("UTC", "GetTime", new { zone = "utc" }, new AjaxOptions { UpdateTargetId = "myResults" })<br />
        @Ajax.ActionLink("BST", "GetTime", new { zone = "bst" }, new AjaxOptions { UpdateTargetId = "myResults" })
        <br />
        @Ajax.ActionLink("MDT", "GetTime", new { zone = "mdt" }, new AjaxOptions { UpdateTargetId = "myResults" })
        <br />
    </p>
    <div id="myResults" style="border: 2px dotted red; padding: .5em;">
        Results will appear here
    </div>
    <p>
        This page was generated at @DateTime.UtcNow.ToString("h:MM:ss tt") (UTC)
    </p>
</body>
</html>

Единственные скрипты, которые вам нужны - это jquery и jquery.unobtrusive-ajax. Также не используйте атрибуты runat="server" в бритве.

и если вы хотите использовать макет:

@{
    ViewBag.Title = "Statistics";
}

<h2>
    Statistics</h2>
<h2>
    What time is it?</h2>
<p>
    Show me the time in:<br />
    @Ajax.ActionLink("UTC", "GetTime", new { zone = "utc" }, new AjaxOptions { UpdateTargetId = "myResults" })<br />
    @Ajax.ActionLink("BST", "GetTime", new { zone = "bst" }, new AjaxOptions { UpdateTargetId = "myResults" })
    <br />
    @Ajax.ActionLink("MDT", "GetTime", new { zone = "mdt" }, new AjaxOptions { UpdateTargetId = "myResults" })
    <br />
</p>
<div id="myResults" style="border: 2px dotted red; padding: .5em;">
    Results will appear here
</div>
<p>
    This page was generated at @DateTime.UtcNow.ToString("h:MM:ss tt") (UTC)
</p>

Еще раз не забудьте 2 сценария в вашем макете.

И последнее замечание: по соглашению все действия контроллера должны возвращать ActionResults, поэтому:

public string GetTime(string zone)
{
    DateTime time = DateTime.UtcNow.AddHours(offsets[zone]);
    return Content(string.Format("<div>The time in {0} is {1:h:MM:ss tt}</div>", zone.ToUpper(), time));
}

Наконец, убедитесь, что вы не используете Microsoft*.js скрипт на своих страницах. Те устарели.

0 голосов
/ 04 марта 2012

Кажется, вы не включили свой ненавязчивый файл Jquery.

Добавьте это на свою страницу:

<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.js")"></script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...