Как выполнить обратную передачу в функцию контроллера, когда значение выбрано из выпадающего списка - PullRequest
1 голос
/ 02 апреля 2012

Я создал раскрывающийся список в представлении и показываю список.

@Html.DropDownListFor(m => m.SelectedId, new SelectList(Model.List, "ID", "Name"))

Я хочу обновить страницу, когда пользователь выбирает значение из раскрывающегося списка.Я не знаю, как отобразить событие выбора из выпадающего списка на функцию контроллера без нажатия какой-либо кнопки.

При загрузке представления есть функция контроллера, которая заполняет представление списком.

public ActionResult Populate()
{
  List<string> list = get it from sql server
  ViewModel viewModel = new ViewModel();
  viewModel.list = list;
   return view();
}

Но как вызвать функцию контроллера, которая будет принимать выбранное значение в качестве идентификатора, извлекать данные и обновлять страницу с результатом.

Ответы [ 5 ]

4 голосов
/ 02 апреля 2012

Вы не можете сделать это без помощи JavaScript.Просто привяжите событие select и отправьте форму или сделайте ajax-запрос.

, используя jQuery:

$('#yourDropDownId').change(function(){
    $('#yourFormId').submit();
});

или, если вам нужен вызов ajax, заданный для отправки, используйте $. Post или $. Получить .

2 голосов
/ 02 апреля 2012

Добавьте это к вашему макету в голове:

<script type="text/javascript">
    $(document).ready(function () {
        $('select:[autopostback=true],input[type=checkbox]:[autopostback=true],input[type=radio]:[autopostback=true]').live('change',function () {
            $(this).closest('form').submit();
        });
    });
</script>

по вашему мнению:

@using (Html.BeginForm())
{
    @Html.DropDownListFor(m => m.SelectedId, new SelectList(Model.List, "ID", "Name"), new { autopostback = "true" })
}

Форма, в которой находится ваш раскрывающийся список, будет отправлена ​​при изменении выбора в раскрывающемся списке. Если результатом действия этой формы будет та же страница, она будет перезагружена с любым обновляемым материалом

2 голосов
/ 02 апреля 2012
$(document).ready(function() {
   $("#ddl").change(function() {
       var strSelected = "";
       $("#ddl option:selected").each(function() {
           strSelected += $(this)[0].value;
       });
       var url = "/Home/MyAction/" + strSelected;

       $.post(url, function(data) {
           // do something if necessary
       });
   });
});

или

<%=Html.DropDownListFor(m => m.SelectedId, new SelectList(Model.List, "ID", "Name"), new { onchange="this.form.submit();" })%>
1 голос
/ 02 апреля 2012

Все просто. В вашем javascript у вас есть:

 $(document).ready(function () {
            $('#SelectedId').change(function () {
                var id = $(this).val();
                $.getJSON("/YourController/YourAction", { id: id},
                function (data) {               
                    $("#SomeDivSelector").html(data);
                });
            });

        });

Ваш контроллер должен выглядеть так:

[AcceptVerbs(HttpVerbs.Get)]
public JsonResult YourAction(int id)
{
  //do something
  return Json(ControlToString("~/Views/YourController/YourView.cshtml", yourModelWithData), JsonRequestBehavior.AllowGet);
}

И ControlToString определяется:

 private string ControlToString(string controlPath, object model)
        {
            //CshtmlView control = new CshtmlView(controlPath);
            RazorView control = new RazorView(this.ControllerContext, controlPath, null, false, null);

            this.ViewData.Model = model;

            using (System.Web.UI.HtmlTextWriter writer = new System.Web.UI.HtmlTextWriter(new System.IO.StringWriter()))
            {
                control.Render(new ViewContext(this.ControllerContext, control, this.ViewData, this.TempData, writer), writer);

                string value = ((System.IO.StringWriter)writer.InnerWriter).ToString();
                return value;
            }
        }

Привет.

0 голосов
/ 02 апреля 2012

То, что вы хотите применить, вопреки концепции используемой вами технологии.MVC на основе технологии ASP.NET, но другой способ выполнения.MVC не использует лучше жизненного цикла ASP.NET, поэтому не «Postback».MVC - в корне основан на архитектурном паттерне, что позволяет разделить разные слои любой системы, поэтому подход к разработке на современных технологиях совершенно другой.узнайте больше о MVC: http://www.asp.net/mvc

, если вы все еще хотите реализовать свою проблему, вы можете использовать концепцию ASP.NET и использовать свойство AutoPostback элемента управления DropDownList.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...