【问题标题】:MVC 4 postback on Dropdownlist change下拉列表更改的 MVC 4 回发
【发布时间】:2017-06-20 02:19:51
【问题描述】:

我正在使用 MVC4,并且我在布局中有一个菜单。我的菜单的一部分包含一个下拉列表,用户可以在其中选择可用的提供商。

<div class="row">
    <div class="col-md-4">
    @Html.DropDownListFor(x=> x.usr.DatUsrs.IdProvider, new SelectList(Lista, "Value","Text"))
    </div>
    <div class="col-md-3">
      Credit
      @Html.DisplayTextFor(x=> x.usrSelectedProvider.AvailiableCredit)
    </div>
    <div class="col-md-3">
      TEXT
    </div>
    <div class="col-md-2">
      Closing Day  @Html.DisplayTextFor(m=> m.usrSelectedProvider.ClosingDay)
    </div>
  </div>

我遇到的问题是:当用户更改下拉列表中的选定项目时,我想进行回发以便能够加载 AvailiableCredit 和 ClosingDay。在网络表单中我可以使用自动回发来做到这一点,但我还没有找到在 MVC4 中做到这一点的方法

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-4


    【解决方案1】:

    有几种方法可以做到这一点,但首先你需要了解你正在做的事情的结构。

    它不是 MVC 中的“回发”(或者,实际上,一般来说,在 HTTP 中......WebForms 对你撒谎了)。您要做的只是将数据发布到服务器并接收响应。在 MVC 框架中,该帖子的目标是控制器操作。根据您采用的方法,响应可能有多种不同的方式。

    我建议编写一些 JavaScript 来通过 AJAX 执行此任务。这样页面不会刷新,您只是发送/接收与手头特定任务相关的数据。 ASP.NET MVC 自带 jQuery,所以我假设在这种情况下使用 jQuery。

    首先,您需要绑定到该select 元素的更改事件。它可能id“IdProvider”标识,但您需要检查呈现的 HTML 以确保。假设是,你可以使用这样的东西:

    $('#IdProvider').change(function () {
        // respond to the change event in here
    });
    

    现在您可以在该处理程序中对服务器进行 AJAX 调用。可能很简单:

    var selectedValue = $('#IdProvider').val();
    $.post('@Url.Action("MyAction", "MyController")', { selection : selectedValue }, function (data) {
        // handle the server response here
    });
    

    这样,控制器操作将在名为 selection 的参数中提供所选值:

    public ActionResult MyAction(string selection)
    {
        // do your server-side processing and get your data
        return Json(data);
    }
    

    此操作返回 Json 格式的数据,因为客户端上的 JavaScript 正在使用它。因此,在处理上述$.post() 调用中的响应时,您会在data 值中获得该数据。

    您如何处理 JavaScript 代码中的数据取决于您自己。如果它是一个包含您正在寻找的两个值的简单结构,它可能是这样简单的:

    $('#AvailableCredit').text(data.AvailableCredit);
    $('#ClosingDay').text(data.ClosingDay);
    

    或者,您可以select 元素包装在form 中,并在选择更改时发布整个内容,然后控制器操作会想要返回一个View 并带有该视图中填充的数据。但这可能有点矫枉过正,因为您只想发送一个值并接收两个值。

    【讨论】:

      【解决方案2】:

      免责声明这种方法将提交整个表单。 如果可能,最好执行 Ajax 操作而不是表单提交。 David 的回答解释了如何进行 Ajax 调用。

      如果将类 data-on-change-submit 添加到选择列表(或任何应触发回发的输入元素)。然后可以添加事件处理程序;它将提交更改表格,如下所示。

      $(function () {
          $(".data-on-change-submit")
              .change(function ()
                      {
                         var form = button.closest("form");
                         form.submit();
                      })
      });
      

      【讨论】:

        【解决方案3】:

        在 MVC 中不需要回发, 当用户从下拉列表中选择时,再次重定向到相同的操作,但这次该操作将具有 HttpPost 属性(这将是您的回发)。然后你可以做任何你喜欢的事情并重新渲染相同的视图,但这次使用新的视图模型(加载你的新数据:AvailiableCredit 和 ClosingDay)

            public ActionResult DisplayMainView()
            {    
              LoadDataOnDropDown();    
              return View();    
            }
        

        在用户选择值时的下拉列表中,重定向到操作(使用 httpPost)并提供重新加载数据所需的任何值。

        [HttpPost]
        public ActionResult DisplayMainView(string selectedValueFromDropdown) {
        
        // get AvailiableCredit and ClosingDay  based on selection
        ViewBag.AvailiableCredit = myService.GetAvailiableCredit (selectedValueFromDropdown);
        ViewBag.ClosingDay   = myService.GetClosingDay (selectedValueFromDropdown);
        
        return View;
        
        }
        

        这是一个伪代码,说明您应该如何使用 HttpPost 来模拟 webForm 回发。 注意:我使用了 viewbag,但我建议为您创建的每个视图使用单独的视图模型。

        【讨论】:

        • 你能给我一个简单的例子吗?
        • 我有一点不同的场景,我也有提交按钮页面并且请求执行相同的操作。我怎么知道请求是来自下拉菜单还是提交按钮。
        • 太好了,现在当您想真正点击“保存”按钮时该怎么办?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多