2012-03-04 3 views
0

У меня есть этот метод в контроллере.Ajax call не работает в asp.mvc

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 element..but времени, представленное на пустой странице (то есть есть постбэк вместо 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> 
+0

Возможно, вы попытаетесь использовать 'ActionResult' как возвращаемый тип и получить значение как' return Content («Любая строка»); '. – Oybek

+0

Я не думаю, что это действительно актуально – BlackFire27

ответ

1

Вы включили макет, но с вашей точки зрения, у вас есть весь <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

Thanks.Darin, Этот форум повезло с тобой. Еще один вопрос. У меня есть главная страница ... И я дважды определял заголовок (мне говорит визуальная студия). Что делать, если я хочу переопределить атрибут title masterpages. Что бы я сделал тогда? – BlackFire27

+0

@ BlackFire27, в вашем макете: ' @ ViewBag.Title' и на ваш взгляд: '@ {ViewBag.Title =" Статистика "; } '. –

0

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

Добавьте к странице:

<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.js")"></script> 
+0

hmm..that did not help – BlackFire27

+0

Вы проверили, что этот файл был загружен? ваша проблема выглядит как поведение, когда обработчик события ajax не привязан к ссылке (обычно это мешает вам переключиться на URL-адрес, то есть резервное поведение, если у кого-то отключено JS - btw: вы не отключили js?) – Marc

+0

нет..it включен..i использование хром. youtube/google work..so мой код должен. Как я могу проверить, был ли загружен мой файл? СМОТРИТЕ ОБНОВЛЕНИЕ – BlackFire27

Смежные вопросы