Передача двух параметров контроллеру из выпадающего списка и javascript

Я создаю приложение в c# с помощью mvc 2010 Express, и у меня есть одно представление, состоящее из 3 разных таблиц: tmarkets, tcountries и tanalysis. Каждый рынок имеет много стран, и каждая страна может иметь более одного анализа (определяется code).

У меня есть представление для выбора анализа для консультации (он передает код контроллеру), а затем в следующем представлении у меня есть раскрывающийся список различных рынков (чтобы пользователь мог видеть анализ стран этого рынка для этого анализа). Мне нужно иметь два разных представления, потому что мне также нужны другие параметры во втором.

Inform Контроллер:

public ActionResult Filter(string id)
{
    var merc = from a in dre.v_AnalysisCountry
               where a.Code == id
               select a;
    var query1 = merc.Select (a => new { a.Code,a.Market}).Distinct().OrderBy(a => a.Market);
    ViewBag.mar = new SelectList(query1.AsEnumerable(), "Code", "Market");
    return View();
}

Просмотр Filter:

<script type="text/javascript">
$(function () {
    $("#Market").change(function () {
    var actionUrl = $('#TheForm1').attr('action') + '/' + $('#Market').val();
        $('#TheForm1').attr('action', actionUrl);
        $('#TheForm1').submit();
    });
});
</script>

@using (Html.BeginForm("FilterAnMark", "Inform", FormMethod.Post, new { id = "TheForm1"})){
@Html.DropDownList("Market", (SelectList)ViewBag.mar, "Select a market")

}

Чтобы заполнить раскрывающийся список различными рынками, мой консультант выбирает их из code и самого market, чтобы позже я мог передать код анализа контроллеру для следующего view.

Проблема в том, что мне также нужно было бы передать рынок controller, а не только пользователю в раскрывающемся списке. Я пытался сделать что-то вроде этого:

@using (Html.BeginForm("FilterAnMark", "Inform", FormMethod.Post, new { id = "TheForm1", id2 = @ViewBag.idAn })){
    @Html.DropDownList("Market", (SelectList)ViewBag.mar, "Select a market")
}

а затем в моем controller:

var idAnalysis = (from v in dre.v_AnalysisCountry
                  where v.Code == id
                  select v.IdAnalysisCountry).FirstOrDefault();
ViewBag.idAn = idAnalysis;

Но это не работает.

-------------------------------------------------- --------РЕДАКТИРОВАТЬ------ --------------------------------

Я добавил скрытый атрибут в свое представление:

@{
    string code= ViewBag.code;
}

@using (Html.BeginForm("FilterAnMark", "Inform", FormMethod.Post, new { id = "TheForm1"})){
    @Html.DropDownList("Market", (SelectList)ViewBag.mar, "Select a market")
    @Html.Hidden("code", code)
}

И это работает, так как передает код следующему представлению. Проблема здесь заключается в следующем представлении. Я использую WebGrid для отображения стран.

WebGrid grid = new WebGrid(Model, defaultSort: "Market", rowsPerPage: 15);

Когда пользователь пытается отобразить вторую страницу таблицы, он отображает пустую таблицу, так как не запоминает этот скрытый атрибут.

Я был бы очень признателен, если бы вы могли помочь мне с другим решением или исправлением этого частичного решения, которое я нашел. Заранее спасибо!


person eryel    schedule 09.09.2013    source источник


Ответы (1)


Наконец, я решил проблему со скрытым атрибутом, добавив один промежуточный результат ActionResult (IntermFilter) в свой контроллер.

Он получает Market и Code, а также идентификатор первого анализа, удовлетворяющего этим двум параметрам. Затем он перенаправляется на представление, в котором WebGrid отображается, как и раньше, так как в FilterMarket ActionResult он получает Market и Code из IdAnalysis.

Вот мой код:

public ActionResult IntermFilter(string id, string code)
{
    int idFirstAn = (from m in dre.v_AnalysisCountry
                      where m.Code == code && m.Market == id
                      select m.IdAnalysis).FirstOrDefault();
    return RedirectToAction("FilterAnMark", new { id = idFirstAn });
}

public ActionResult FilterAnMark(int id)
{
    var query = (from m in dre.v_AnalysisCountry
                 where m.IdAnalysis == id
                 select m).FirstOrDefault();
    var countries = new FilterManager().ObtainMarkets(query.Code, query.Market);
    ViewBag.code = query.Code;
    ViewBag.market = query.Market;
    return View(countries);
}
person eryel    schedule 10.09.2013