none
Ajax.DropDownList и повторный запрос к серверу RRS feed

  • Вопрос

  • Здравствуйте! Толком и не знаю, как описать проблему... 
    Проблема в том, что при выборе пункта в одном из Ajax.DropDownList, происходит передача параметров сначала с данными из контролов, а потом повторная с нулями вместо параметров из контролов. Причем, это происходит только у второго контрола, то есть того, который вторым идет от формы. Странная закономерность! Первый всегда работает корректно и возвращает верные данные! Пробовал играть с параметрами AjaxOptions во всех случаях - не помогло. 

    Описание проблемы:

    1) я выбираю первый DropDownList и он возвращает отсортированные данные

    2) я выбираю второй DropDownList, он на полторы секунды возвращает выборку, как и должен, но потом обновляет эти данным отсортированными данными из первого DropDownList.


    Вот так выглядит представление, я его очистил от тэгов и всего лишнего:

    @using(Ajax.BeginForm( "PartnerApplications", 
                            null, 
                            new AjaxOptions() { 
                                 HttpMethod = "POST", 
                                 InsertionMode = InsertionMode.Replace,  
                                 UpdateTargetId = "target", 
                                 LoadingElementId = "AjaxSearch" },
                            new { id = "PartnerApplicationsForm"})) 
    {
    
    @Ajax.DropDownList(null, new AjaxOptions()
    { 
                                 HttpMethod = "POST", 
                                 InsertionMode = InsertionMode.Replace,  
                                 UpdateTargetId = "target", 
                                 LoadingElementId = "AjaxSearch"},
    new[]
       {
          new SelectListItem { Value = "0", Text = "Заявки от новых к старым" },
          new SelectListItem { Value = "1", Text = "Заявки от старых к новым" }
        }, 
     new { @id = "DropDownListSort", @name = "DropDownListSort", @class = "chosen" }
    )
    
    @Ajax.DropDownList(null, new AjaxOptions()
    {
        HttpMethod = "POST",
        InsertionMode = InsertionMode.Replace,
        UpdateTargetId = "target",
        LoadingElementId = "AjaxSearch"}, 
    contact_items, 
     new { @id = "DropDownOtvetstv", @name = "DropDownOtvetstv", @class = "chosen" }, "Ответственный за заявку"
    )


    Вот код Ajax.DropDownList, который я нашел в сети:

    public static MvcHtmlString DropDownList(this AjaxHelper html, string action, AjaxOptions options, IEnumerable<SelectListItem> selectItems, IDictionary<string, object> listHtmlAttributes, string defaultItem=null)
      {
          var url = new UrlHelper(html.ViewContext.RequestContext);
    
          // Wrap it in a form
          var formBuilder = new TagBuilder("form");
    
    
          //  build the <select> tag
          var listBuilder = new TagBuilder("select");
          if (listHtmlAttributes != null && listHtmlAttributes.Count > 0) listBuilder.MergeAttributes(listHtmlAttributes);
          StringBuilder optionHTML = new StringBuilder();
    
          // пишем значение по умолчанию
          var optionBuilder = new TagBuilder("option");
          if (defaultItem != null)
          {
              optionBuilder.MergeAttribute("value", "0");
              optionBuilder.InnerHtml = defaultItem;
              optionHTML.Append(optionBuilder.ToString());
          }
    
          // пишем другие элементы
          foreach (SelectListItem item in selectItems)
          {
              optionBuilder = new TagBuilder("option");
              optionBuilder.MergeAttribute("value", item.Value);
              optionBuilder.InnerHtml = item.Text;
              if (item.Selected)
              {
                  optionBuilder.MergeAttribute("selected", "selected");
              }
    
              //optionBuilder.Attributes["onchange"] = "($this.form).attr('action', '" + url.Action(action, routeValues).Replace("___", item.Value) + "');$(this.form).submit();";
              optionHTML.Append(optionBuilder.ToString());
          }
          listBuilder.InnerHtml = optionHTML.ToString();
          listBuilder.Attributes["onchange"] = "$(this.form).attr('action', '" + url.Action(action).Replace("___", "' + $(this).first('option:selected').val() + '") + "');$(this.form).submit();";
          formBuilder.InnerHtml = listBuilder.ToString();
    
          foreach (var ajaxOption in options.ToUnobtrusiveHtmlAttributes())
              formBuilder.MergeAttribute(ajaxOption.Key, ajaxOption.Value.ToString());
          string formHtml = formBuilder.ToString(TagRenderMode.Normal);
    
          return MvcHtmlString.Create(formHtml);
      }

    Исходный текст представления выглядит вот так:

    <form action="/Partner/PartnerApplications" data-ajax="true" data-ajax-loading="#AjaxSearch" data-ajax-mode="replace" data-ajax-update="#target" id="PartnerApplicationsForm" method="post"><div class= "parappheader">Заявки пользователей:</div>  
     
    <div class= "dropdownsort">
    <form data-ajax="true" data-ajax-loading="#AjaxSearch" data-ajax-method="POST" data-ajax-mode="replace" data-ajax-update="#target"><select class="chosen" id="DropDownListSort" name="DropDownListSort" onchange="$(this.form).attr(&#39;action&#39;, &#39;/Partner/PartnerApplications&#39;);$(this.form).submit();"><option value="0">Заявки от новых к старым</option><option value="1">Заявки от старых к новым</option></select></form>
    </div>
    
    <div class= "otvetstv">
    <form data-ajax="true" data-ajax-loading="#AjaxSearch" data-ajax-method="POST" data-ajax-mode="replace" data-ajax-update="#target"><select class="chosen" id="DropDownOtvetstv" name="DropDownOtvetstv" onchange="$(this.form).attr(&#39;action&#39;, &#39;/Partner/PartnerApplications&#39;);$(this.form).submit();"><option value="0">Ответственный за заявку</option><option value="1">gfgdfgdf</option><option value="2">765767</option></select></form>
    </div>

    Проверить на null все присылаемые параметры в контроллере не могу, ибо тогда неясно, что возвращать представлению. 


    Помогите, пожалуйста! =)


    • Изменено kotfantazer 21 декабря 2012 г. 14:08 решил уточнить
    21 декабря 2012 г. 14:00

Ответы

  • А Вы случайно не вкладываете одну форму в другую, что категорически запрещено. Просто я не вижу закрывающий тег вашей первой формы.
    • Предложено в качестве ответа YatajgaEditor 22 декабря 2012 г. 8:30
    • Помечено в качестве ответа kotfantazer 23 декабря 2012 г. 20:07
    21 декабря 2012 г. 15:02
    Модератор
  • Большое спасибо! Я извлек DropDownList'ы из формы и все заработало.
    • Предложено в качестве ответа YatajgaEditor 22 декабря 2012 г. 8:30
    • Помечено в качестве ответа kotfantazer 23 декабря 2012 г. 20:07
    21 декабря 2012 г. 15:28

Все ответы

  • А Вы случайно не вкладываете одну форму в другую, что категорически запрещено. Просто я не вижу закрывающий тег вашей первой формы.
    • Предложено в качестве ответа YatajgaEditor 22 декабря 2012 г. 8:30
    • Помечено в качестве ответа kotfantazer 23 декабря 2012 г. 20:07
    21 декабря 2012 г. 15:02
    Модератор
  • Ха! именно так я и делаю=) Но мне нужно как-то обновить div по его id, который находится за пределами обеих форм, которые генерируются для DropDownList'ов.

    Вот полный код представления, без лишних тэгов:

    @using(Ajax.BeginForm( "PartnerApplications", 
                            null, 
                            new AjaxOptions() { 
                                 
                                 InsertionMode = InsertionMode.Replace,  
                                 UpdateTargetId = "target", 
                                 LoadingElementId = "AjaxSearch" },
                            new { id = "PartnerApplicationsForm"})) 
    {
    
    
    
    @Ajax.DropDownList(null, new AjaxOptions()
    {
        HttpMethod = "POST",
        InsertionMode = InsertionMode.Replace,
        UpdateTargetId = "target",
        LoadingElementId = "AjaxSearch"
    },
    new[]
       {
          new SelectListItem { Value = "0", Text = "Заявки от новых к старым" },
          new SelectListItem { Value = "1", Text = "Заявки от старых к новым" }
        }, @* тут ты можешь поставить запятую и писать свои параметры! *@
     new { @id = "DropDownListSort", @name = "DropDownListSort", @class = "chosen" }
    )
    
    @Ajax.DropDownList(null, new AjaxOptions()
    {
        HttpMethod = "POST",
        InsertionMode = InsertionMode.Replace,
        UpdateTargetId = "target",
        LoadingElementId = "AjaxSearch"
    },
    contact_items, 
     @*"Ответственный за заявку",*@
     new { @id = "DropDownOtvetstv", @name = "DropDownOtvetstv", @class = "chosen" }, "Ответственный за заявку"
    )
    
    <div id="target">
    @Html.Partial("~/Views/Partner/PartnerApplicationsPartial.cshtml")
    </div>
      
    }

    • Помечено в качестве ответа kotfantazer 21 декабря 2012 г. 15:28
    • Снята пометка об ответе kotfantazer 21 декабря 2012 г. 15:28
    21 декабря 2012 г. 15:15
  • Большое спасибо! Я извлек DropDownList'ы из формы и все заработало.
    • Предложено в качестве ответа YatajgaEditor 22 декабря 2012 г. 8:30
    • Помечено в качестве ответа kotfantazer 23 декабря 2012 г. 20:07
    21 декабря 2012 г. 15:28