передача параметров между контроллерами ASP.MVC

350
20 августа 2017, 03:20

Добрый день. В проекте ASP.MVC столкнулся с поведением, которое смог обойти, но не могу объяснить. Суть вопроса: форма в представлении отправляет в контроллер массив из двух string. Метод контроллера должен пробросить этот массив в другой контроллер, где его есть кому обработать. И пробросить массив я не смог - вместо массива в параметры второго контроллера приходит только имя типа.
Вопрос почему так происходит? Это нормальное поведение или я сто-то сделал не так?

Код (сначала - работающая версия): Представление (валидаторы выкинул, но следы от них остались в параметрах):

  @using (Html.BeginForm("Submit", "Home",  FormMethod.Post,  new { novalidate = "", name = "InputForm", ng_controller = "SubmitCtrl", role = "form" }))
    {
        <div class="form-group">
            @Html.Label("Введите адрес сайта в поле ввода и нажмите кнопку")
            @Html.TextBox(
                "Url0",
                null,
                new { type = "url", @class = "form-control", required = "", placeholder = "Enter url here", id = "url11", ng_model = "url1" })
            <div>
                @Html.Label("Выберите количество запросов к странице сайта")
                @Html.DropDownList("Url0", new SelectList(new string[] { "4", "5", "6", "7" }), new {  @class = "form-control"})
            </div>

        </div>

        <button type="submit" class="btn btn-primary" ng-click="Press()" ng-disabled="InputForm.$invalid">Отправить</button>
        <div ng-show="pressed">
            <img src="~/Content/Image/please_wait.gif" />
        </div>
    }

Контроллер, принимающий данные из представления и пробрасывающий их в другой контроллер (лишние блоки удалены).

[HttpPost]
    public ActionResult Submit(string [] Url0)
    {
         return RedirectToAction("Index", "Tool", new {url= Url0[0], attempts=Url0[1]});
    }

Контроллер, обрабатывающий данные:

public ActionResult Index(string url, string attempts)
        {
               manager = new VMManager();
               int att;
               if (Int32.TryParse(attempts, out att)) manager.AttemptsQuantiy = att;
               manager.VM = (SiteVM)manager.ParseUrl(url);
                if (manager.VM.PageResults.Count == 0) return RedirectToAction("Error", "Home", null);
                else return RedirectToAction("ShowResult", "Tool", null);
}

Нерабочий код:

public ActionResult Index(string[] url)

в методе Submit :

return RedirectToAction("Index", "Tool", new {url= Url0});

или

return RedirectToAction("Index", "Tool", url= new string [] {Url0[0],Url0[1]});
Answer 1

Это нормальное поведение, т.к. нельзя отправлять сложные объекты при редиректе. Когда ты делаешь редирект, ты отправляешь запрос типа GET на свой метод. А соответственно при отправке GET запроса необходимо отправить всю информацию в качестве параметров строки запроса. И это работает только с простыми скалярными свойствами.

READ ALSO
Замена Graphics.DrawLine на DrawingContext.DrawLine

Замена Graphics.DrawLine на DrawingContext.DrawLine

Имеется код, который нормально работает в WinForms, но хочется перенести его в WPF

227
DigitalProductId не всегда находит

DigitalProductId не всегда находит

Пытаюсь получить ключ продукта windows, на win 7 работает нормально, но на других осях не показывает

243
Не публикуется asp.net core проект

Не публикуется asp.net core проект

Поставил VS2017 pro, обнаружил, что не работает кнопка опубликовать, те

215
Замена буквы в строке

Замена буквы в строке

Есть алфавит, например, string alfabet="abc"; Далееесть 1

280