在mvc中以ajaxian方式更新下拉更改事件的数据

时间:2009-06-10 14:27:41

标签: asp.net-mvc ajax

方案

  

我在页面上有下拉列表,   现在关于它的变化事件我会   喜欢从数据库中提取一些数据   然后显示它。

     

我可以用回发来做,我   尝试使用Ajax.Beginform()但它   还在回帖。

<script src="../../Scripts/MicrosoftAjax.js" type="text/javascript"></script>
<script src="../../Scripts/MicrosoftMvcAjax.js" type="text/javascript"></script>

    <%using (Ajax.BeginForm("UpdatePanel", new AjaxOptions { UpdateTargetId = "divDetails" }))
          {%>
        <%=Html.DropDownList("Dinner", (SelectList)ViewData["Dinner"], new { onchange = "this.form.submit();" })%>
        <div id="divDetails">
            <fieldset>
                <legend>Details</legend>
                <% if (Model != null)
                   {%>
                <p>
                    ID:
                    <%= Html.Encode(Model.ID)%>
                </p>
                <p>
                    Title:
                    <%= Html.Encode(Model.Title)%>
                </p>
                 <%} %>
            </fieldset>
            <%} %>

任何帮助表示感谢。

4 个答案:

答案 0 :(得分:2)

我相信您使用BeginForm的问题是MVC总是会进行整页回发 - 至少在我的经验中。如果您想要“部分”回发,则需要使用javascript和webservices。

我正在使用GeoIP做到这一点。这是我的页面的样子:

<p>
<label for="country">Country</label>
<%= Html.DropDownList("country", new SelectList(Model.Countries, "CountryId", "Name", Model.DefaultCountry.CountryId))%>
<%= Html.ValidationMessage("country")%>
</p>

<p>
<label for="subdivision">Subregion</label>
<%= Html.DropDownList("subdivision", new SelectList(Model.Subdivisions, "SubdivisionId", "Name", Model.DefaultSubdivision.SubdivisionId)) %>
<%= Html.ValidationMessage("subdivision")%>
</p>

<script type="text/javascript">

    $('#country').change(function() {

        $('#subdivision').children().remove();

        var countryId = $("#country > option:selected").val();

        Sys.Net.WebServiceProxy.invoke   
            (   
                '/WebServices/Regions.asmx',
                "GetSubdivisions",   
                false,
                { countryId: countryId },
                addressControl_bindOptionResults   
            );
    });

    function addressControl_bindOptionResults(data)   
    {   
        for (var x = 0; x < data.length; x++) {
            $("#subdivision").append($('<option></option>').val(data[x].Id).html(data[x].Name));  
        }   
    }

</script>

我的网络服务看起来像这样。添加新的Web服务时,请确保取消注释类声明上方的属性:

[System.Web.Script.Services.ScriptService]

请记住,您返回的对象必须是可序列化的。

[WebMethod]
        public Subdivision[] GetSubdivisions(int countryId)
        {
            if (this.repository == null)
            {
                Resolve();
            }

            List<Subdivision> subdivisions = new List<Subdivision>(repository.GetActiveSubdivisionsDto(countryId));

            return subdivisions.ToArray();
        }

忽略我的网络服务的一些内部工作原理。我在我的数据层使用unity,Nfluent和NHibernate,但基础是相同的。调用数据库,获取对象,并返回可序列化数据传输对象的列表(我的只是名称和ID)。

答案 1 :(得分:1)

你考虑过使用jQuery吗?我使用jQuery.post作为我的解决方案。 这是一个适合我的例子:

jQuery(document).ready(function() {

  // Dropdown or select list
  jQuery('#countryListBox').change(function(){ populateCityListBox(); });

  function populateCityListBox()
  {
    //Get ID for selected country
    var ctryID = jQuery("select#countryListBox").val();

    jQuery.post("inclyde/jquery_get_data.php", { instance: 'getCitiesByCountry', countryID: ctryID },
      function(data)
      {
          //Process data and store it in var newContent.
          // Then bind data to the div you wish to present the content
          jQuery("div.myNewText").html(newContent);

      }, "json");
  }
});

我很难让.NET Ajax工作。在我发现jQuery之后,事情非常甜蜜:)

答案 2 :(得分:0)

问题是onchange =“this.form.submit();”。 当您通过form.submit()提交表单时,Ajax - MS的脚本不会启动。 通过放置

进行检查
<input type="submit" value="submit" /> 

以删除form.submit()的形式。然后,控制器中的请求将是Request.IsAjaxRequest = true。

我不知道如何以一种很好的方式摆脱提交按钮 - 我让它变得不可见并通过Javascript点击它。

这是我第一次在MVC的ajax拍摄。然后我用了jquery,很高兴。

答案 3 :(得分:-1)

老话题,但我遇到了同样的问题并最终弄明白了:

变化:

onchange = "this.form.submit();" 

为:

onchange = "$(this.form).submit();"