Как вызвать действие URL в MVC с функцией JavaScript?

Я пытаюсь сделать действие URL с помощью JavaScript в проекте MVC. Я фиксирую на своей странице событие, которое вызывает эту функцию, но я не уверен, как вызвать этот определенный URL.

Кто-нибудь может мне помочь?:)

function onDropDownChange(e) {
    var url = '/Home/Index/' + e.value;
    //What now...?
}

----------- Отредактировано -----------------------

Вот мое действие контроллера:

    public ActionResult Index(int? id)
    {
        var tmpToday = DateTime.Now;
        var today = new DateTime(tmpToday.Year, tmpToday.Month, tmpToday.Day, 0, 0, 0);

        if (id != null)
        {
            var num = id.GetValueOrDefault();
            var rentableUnits = new List<Unit>();
            _unitLogic.GetAllRentableUnitsByArea(num, rentableUnits);

            var allAvailabilities = new ShowAvailability[rentableUnits.Count];

            for (int i = 0; i < rentableUnits.Count; i++)
            {
                var sTime = GetFirstDayOfMonth(today);
                var eTime = GetLastDayOfMonth(today);
                allAvailabilities[i] = new ShowAvailability(sTime, eTime.AddHours(23.0).AddMinutes(59.0), rentableUnits);
                today = today.AddMonths(1);
            }

            var showAvailability = new List<ShowAvailability>(allAvailabilities);

            return View(new HomeFormViewModel(showAvailability));
        }
        else
        {
            var allAvailabilities = new ShowAvailability[12];

            for (int i = 0; i < 12; i++)
            {
                var sTime = GetFirstDayOfMonth(today);
                var eTime = GetLastDayOfMonth(today);
                allAvailabilities[i] = new ShowAvailability(sTime, eTime.AddHours(23.0).AddMinutes(59.0));
                today = today.AddMonths(1);
            }

            var showAvailability = new List<ShowAvailability>(allAvailabilities);

            return View(new HomeFormViewModel(showAvailability));
        }
    }
#

Я использую расширение Telerik для моего DropDownList, который запускает функцию javascript, на самом деле это Razor View:

 @(Html.Telerik().DropDownList()
     .Name("DropDownList")
     .Items(area =>
         {
             area.Add().Text("Öll svæði").Value("0").Selected(true);
             foreach (Unit a in Model.Areas)
                {
                     area.Add().Text(a.Name).Value(a.UnitID.ToString());
                }
         })
     .HtmlAttributes(new { style = "width: 130px;" })
     .ClientEvents(clev => clev.OnChange("onDropDownChange"))
     )

Вот сценарий:

function onDropDownChange(e) {
    var url = '/Home/Index/' + e.value;
    $.ajax({
            type: "GET",
            url: url,
            data: {},
            dataType: "html"
        });
}

3 ответа

Решение

В вашем onDropDownChange обработчик, просто сделайте вызов JQuery AJAX, передавая любые данные, которые вам нужно передать на ваш URL. Вы можете обрабатывать успешные и неудачные вызовы с помощью success а также error опции. в success использовать данные, содержащиеся в data аргумент, чтобы сделать то, что вам нужно сделать. Помните, что они асинхронные по умолчанию!

function onDropDownChange(e) {
    var url = '/Home/Index/' + e.value;
    $.ajax({
      url: url,
      data: {}, //parameters go here in object literal form
      type: 'GET',
      datatype: 'json',
      success: function(data) { alert('got here with data'); },
      error: function() { alert('something bad happened'); }
    });
}

Документация по jJuery AJAX находится здесь.

Я собираюсь дать вам 2 способа вызвать действие со стороны клиента

первый

Если вы просто хотите перейти к действию, которое вы должны вызвать, просто используйте следующую

window.location = "/Home/Index/" + youid

Примечания: что вам нужно выполнить действие для получения типа get

второй

Если вам нужно отрендерить View, вы можете сделать call by ajax

//this if you want get the html by get
public ActionResult Foo()
{
    return View(); //this return the render html   
}

И клиент назвал так "Предполагая, что вы используете jquery"

$.get('your controller path', parameters to the controler , function callback)

или же

$.ajax({
    type: "GET",
    url: "your controller path",
    data: parameters to the controler
    dataType: "html",
    success: your function
});

или же

$('your selector').load('your controller path') 

Обновить

В вашем AJAX называется внести это изменение, чтобы передать данные в действие

function onDropDownChange(e) {
var url = '/Home/Index' 
$.ajax({
        type: "GET",
        url: url,
        data: { id = e.value}, <--sending the values to the server
        dataType: "html",
        success : function (data) {
            //put your code here
        }
    });
}

ОБНОВЛЕНИЕ 2

Вы не можете сделать это в вашем обратном вызове "windows.location", если вы хотите, чтобы он отображал представление, вам нужно поставить div на ваш взгляд и сделайте что-то подобное

в представлении, где вы находитесь, что комбо в каком-то месте

<div id="theNewView"> </div> <---you're going to load the other view here

в клиенте javascript

$.ajax({
        type: "GET",
        url: url,
        data: { id = e.value}, <--sending the values to the server
        dataType: "html",
        success : function (data) {
            $('div#theNewView').html(data);
        }
    });
}

С этим я думаю, что вы решаете свою проблему

Пытаться:

var url = '/Home/Index/' + e.value;
 window.location = window.location.host + url; 

Это должно привести вас туда, куда вы хотите.

Попробуйте использовать на стороне JavaScript следующее:

window.location.href = '@Url.Action("Index", "Controller")';

Если вы хотите передать параметры в @Url.Action, ты можешь это сделать:

var reportDate = $("#inputDateId").val();//parameter
var url = '@Url.Action("Index", "Controller", new {dateRequested = "findme"})';
window.location.href = url.replace('findme', reportDate);

Другой способ убедиться, что вы получаете правильный URL-адрес независимо от настроек сервера, - поместить URL-адрес в скрытое поле на вашей странице и указать его путь:

 <input type="hidden" id="GetIndexDataPath" value="@Url.Action("Index","Home")" />

Тогда вы просто получите значение в вашем вызове ajax:

var path = $("#GetIndexDataPath").val();
$.ajax({
        type: "GET",
        url: path,
        data: { id = e.value},  
        dataType: "html",
        success : function (data) {
            $('div#theNewView').html(data);
        }
    });
}

Я использовал это в течение многих лет, чтобы справиться со странностями сервера, поскольку он всегда создает правильный URL. Он также отслеживает изменение вызовов методов контроллера, если вы помещаете все скрытые поля вместе в одну часть html или делаете отдельную частичку бритвы для их хранения.

Другие вопросы по тегам