Почему моя модель и ее переменные не переходят из View в Method внутри моего контроллера? - PullRequest
0 голосов
/ 29 июня 2018

Мое приложение ищет файлы, содержащие строку, которую ищет пользователь. Пока он делает это отлично. Последнее, что мне нужно сделать, это экспортировать его в файл Excel, поэтому я добавил метод внутри моего контроллера, который вызывается страницей Result после нажатия кнопки.

Результаты сохраняются в List типа Result, который является классом с четырьмя переменными.

Метод ExportToExcel в настоящее время возвращает строку, чтобы я мог проверить, является ли список результатов пустым. Каждый раз, когда он выходит как «Нет данных», поэтому он является нулевым. Он прекрасно печатает таблицу с информацией на странице Results, но не имеет информации, когда я хочу ее экспортировать.

Почему моя модель не переходит из вида в метод?

Сначала я хотел передать свою модель, чтобы я мог получить доступ к информации в List, но теперь мне интересно, будет ли лучше сохранить данные List в контроллере, чтобы я мог напрямую передать их к моему методу.

В любом случае все будет хорошо, и я открыт для любых других способов сделать это.

Модель

namespace Final.Models
{
    public class InputModel:Result
    {

        public List<Result> Results { get; set; }

    }  
}

Контроллер

Этот контроллер просто показывает, как я передаю InputModel между представлениями и методом. Может я тут что-то не так делаю?

        public ActionResult Index()
        {
            var input = new InputModel();
            return View(input);
        }

        [HttpPost]
        public ActionResult Index(InputModel input)
        {
            //Finds files that contain string.
            //send model to Result
            return View("Result", input);
        }

        public ActionResult Result(InputModel input)
        {
            return View(input);
        }

        [HttpPost]
        public string Result(InputModel input,string export)
        {

            return ExportToExcel(input);
        }

        public string ExportToExcel(InputModel input)
        {
            if (input.Results!=null)
            {
                //Run excel code here
              return "Excel Exported";
            }
            else
             {
                 return "No Data";
             }
        }

Просмотр результата

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

 @foreach(var result in Model.Results)
        {

            <tr>
             //Return graph of information received
            </tr>

        }
    </table>

     <form action="Find/Result" method="POST">
           <input type="submit" value="Export" name="export"  class="btn btn-default"> 
     </form>

выход

Происходит после нажатия кнопки «Экспорт»

"No Data"

Это мои первые приложения MVC, поэтому еще раз, пожалуйста, дайте мне знать, если есть какая-либо другая область, в которой я могу улучшить.

Полный просмотр для результата

Изменена форма для включения всего представления в соответствии с предложением Wubbly, но я получаю тот же вывод.

@model Final.Models.InputModel

@{
    ViewBag.Title = "Result";
    Layout = "~/Views/Shared/_Layout.cshtml";
}




    <br />
    <h4>Result</h4>
    <hr />


@using (Html.BeginForm("Result", "Find", FormMethod.Post))
{
    <p>The <b>@Model.SelectedText</b> files that contain <b>"@Model.Find"</b> are:  </p>
    <div>
        <table class="table table-bordered table-responsive table-hover">
            <tr>
                //HEADERS

            </tr>
            @foreach (var result in Model.Results)
            {
                // int i = 1;
                <tr>

                    <td>@result.SelectedText</td>
                    <td>@result.FileName</td>
                    <td>@result.Line</td>
                    <td>@result.LineCode</td>
                </tr>

            }
        </table>

        <div class="form-group">
            <div class="col-md-offset-2 ">

                <input type="submit" value="Export" name="export" class="btn btn-default">


            </div>
        </div>

    </div>
}







    <p>
        @Html.ActionLink("Back to List", "Index")
    </p>

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

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

Во-первых, я изменил свой foreach на for цикл в соответствии с рекомендациями StephenMuecke и ShailendraKumar.

Способ передачи данных из моего HTTPGet в HTTPPost с помощью TempData. Я использовал его для хранения моей модели с пользовательским вводом в моем HTTPPost Индексе и назвал ее в моем HTTPPost Result.

Вот как я сменил контроллер.

       public ActionResult Index()
        {
            var input = new InputModel();
            input.Type = input.FillType(input.Type);

            return View(input);
        }

        [HttpPost]
        public ActionResult Index(InputModel input)
        {
            input.FileType = input.ValueConvert();
            input.FileFind();
            TempData["model"] = input
            return View("Result", input);
        }

        public ActionResult Result(InputModel input)
        {
            return View(input);
        }


        [HttpPost]
        public void Result()
        {
            InputModel model = new InputModel();
            model = (InputModel)TempData["model"];
            model.ExportToExcel();
        }
0 голосов
/ 30 июня 2018

Используйте для цикла со скрытым свойством, которое переносит значение вашего свойства в модель.

@using (Html.BeginForm("Result", "Find", FormMethod.Post))
 {
<p>The <b>@Model.SelectedText</b> files that contain <b>"@Model.Find"</b> are:  </p>
<div>
    <table class="table table-bordered table-responsive table-hover">
        <tr>
            //HEADERS

        </tr>
        @for (int i = 0; i < Model.Results.Count; i++)
        {
            // int i = 1;
            <tr>
                <td>
                    @Html.HiddenFor(r => r.Model.Results[i].SelectedText)
                    @Html.HiddenFor(r => r.Model.Results[i].FileName)
                    @Html.HiddenFor(r => r.Model.Results[i].Line)
                    @Html.HiddenFor(r => r.Model.Results[i].LineCode)

                    @Html.DisplayFor(r => r.Model.Results[i].SelectedText)
                </td>
                <td>@Html.DisplayFor(r => r.Model.Results[i].FileName)</td>
                <td>@Html.DisplayFor(r => r.Model.Results[i].Line)</td>
                <td>@Html.DisplayFor(r => r.Model.Results[i].LineCode)</td>
            </tr>

        }
    </table>

    <div class="form-group">
        <div class="col-md-offset-2 ">

            <input type="submit" value="Export" name="export" class="btn btn-default">


        </div>
    </div>

</div>
 }
 <p>
   @Html.ActionLink("Back to List", "Index")
 </p>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...