从下拉列表中选择值时如何回发到控制器函数

本文关键字:何回发 控制器 函数 下拉列表 选择 | 更新日期: 2023-09-27 18:29:50

我在视图上创建了一个下拉列表,并显示了一个列表。

@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();
}

但是,如何调用一个控制器函数,该函数将所选值作为Id,检索数据并用结果刷新页面。

从下拉列表中选择值时如何回发到控制器函数

如果没有javascript的帮助,就无法做到这一点。只需绑定select事件并发送表单或发出ajax请求。

使用jQuery:

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

或者,如果您需要ajax调用而不是提交,请使用$.post或$.get.

将其添加到头部的布局中:

<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" })
}

当您更改下拉列表的选择时,您的下拉列表所在的表单将被提交。如果该表单的操作结果是相同的页面,那么它将被重新加载任何正在更新的内容

$(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();" })%>

这很简单。在您的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;
            }
        }

谨致问候。

根据您所使用的技术的概念,您想要应用什么。MVC基于ASP.NET技术,但采用另一种执行方式。MVC没有使用更好的ASP.NET的生命周期,所以,没有"Postback"。MVC-在根上基于架构模式,允许分离任何系统的不同层,因此在当前技术上的开发方法完全不同。了解有关MVC的更多信息:http://www.asp.net/mvc

如果您仍然想实现您的问题,您可以使用ASP.NET概念并使用DropDownList控件的AutoPostback属性。