включить выпадающий html через контроллер в mvc - PullRequest
0 голосов
/ 25 октября 2010

У меня есть сценарий, в котором я должен выполнить какое-то действие в соответствии с выбором раскрывающегося списка.

Для базового задания вы можете использовать пример страны, штата, города.

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

после того, как страны заполнены, я хочу выбрать штат. Он заполняется.

twoпроблемы

1) как сохранить состояние страны ddl, когда оно возвращается в свое первоначальное состояние.2) как включить раскрывающийся список через мой контроллер.

код myview

Страна

     <p>
        <label>
            State</label>
        <%=Html.DropDownList("ddlState", ViewData["ddlState"] as SelectList, "--not selected--",new { onchange = "document.forms[0].submit()", disabled = "disabled" })%>
    </p>

     <p>
        <label>
            City</label>
        <%=Html.DropDownList("ddlCities", ViewData["ddlCities"] as SelectList, "--not selected--", new { onchange = "document.forms[0].submit()", disabled = "disabled" })%>
    </p>

код моего контроллера

    public ActionResult InsertData()
    {

        var customers = from c in objDetailEntity.Country
                        select new
                        {
                            c.Cid,
                            c.Cname
                        };

        SelectList countriesList = new SelectList(customers.Take(100), "Cid", "Cname");
        ViewData["ddlCountries"] = countriesList;

        SelectList EmptyState = new SelectList(customers);
        ViewData["ddlState"] = EmptyState;
        ViewData["ddlCities"] = EmptyState;
        Session["ddlSesCountry"] = countriesList;
        return View();

    }




    //
    // POST: /RegisTest/Create

    [HttpPost]
    public ActionResult InsertData(FormCollection collection)
    {
        try
        {
            CountryId = Convert.ToInt16(Request.Form["ddlCountries"]);
            stateid = Convert.ToInt16(Request.Form["ddlState"]);
            if (CountryId > 0 && stateid <= 0)
            {
                var stateslist = from c in objDetailEntity.State
                                 where c.Country.Cid == CountryId
                                 select new
                                 {
                                     c.Sid,
                                     c.Sname
                                 };

                SelectList stateList = new SelectList(stateslist.Take(100), "Sid", "Sname");
                ViewData["ddlState"] = stateList;
                Session["StateList"] = stateList;
                ViewData["ddlCities"] = stateList;
            }

            if (stateid > 0)
            {
                var citieslist = from c in objDetailEntity.City
                                 where c.State.Sid == stateid
                                 select new
                                 {
                                     c.Ctid,
                                     c.Cityname
                                 };

                SelectList cityList = new SelectList(citieslist.Take(100), "Ctid", "Cityname");


                ViewData["ddlCities"] = cityList;
                ViewData["ddlState"] = Session["StateList"];
            }

            ViewData["ddlCountries"] = Session["ddlSesCountry"];



            return View();
        }
        catch
        {
            return View();
        }
    }

Ответы [ 2 ]

0 голосов
/ 17 ноября 2010

Я рекомендую использовать JSON & jQuery - как этот опубликованный ответ .

0 голосов
/ 25 октября 2010

Мой выбор - не публиковать обратно форму вообще.Я написал бы действие в контроллере, который принимает CountryID и возвращает JsonResult, содержащий список состояний.Событие onchange может вызвать функцию jQuery, которая использует AJAX для вызова этого действия, загружает новый список и включает второй раскрывающийся список.

Однако, если вы придерживаетесь обратной передачи, вот почему она не работает:

  1. В списке «Страна» не сохраняется выбранное значение, поскольку представление каждый раз перезагружается с нуля, и вы устанавливаете его как «не выбрано».Конструктор SelectList имеет перегрузку, которая принимает объект SelectedItem в качестве четвертого параметра.При инициализации списка SelectList вы должны передать этому параметру соответствующее значение, а не принудительно вводить его в представлении.

  2. Вам необходимо написать в своем представлении предложение "if", чтобы выбратьследует ли включить список на основе некоторых критериев.Вы можете привязать к ViewModel, который имеет логическое свойство, например «EnableStates», или вы можете использовать что-то вроде подсчета значений в StateList - если это число больше нуля, включите его, например.

При переходе от веб-форм к MVC сложно привыкнуть к тому, что у вас больше нет ViewState - ваше приложение не имеет состояния.Там нет ничего, что "помнит", какое значение выбрано для вас в раскрывающемся списке, вы должны устанавливать его каждый раз при загрузке страницы.

...