Arhn - архитектура программирования

Использование HTML-формы

Я пытаюсь добавить на свою страницу поисковую форму:

@using (Html.BeginForm("CheckCourses", "Home", new { programId = ViewBag.ProgramId }, FormMethod.Get))
{
    <p class="col-md-12">
        Find by course or teacher name: @Html.TextBox("SearchString", ViewBag.CurrentFilter as string)
        <input type="submit" value="Search Course" class="btn-primary" />
    </p>
}

Теперь CheckCourses() должен иметь programId для запуска (не допускающий значения NULL). Вот почему я добавил new { programId = ViewBag.ProgramId } в routeHelper. ViewBag.ProgramId не является нулем во время выполнения этого кода, однако, когда я нажимаю кнопку Search Course, я получаю сообщение о том, что значение programId равно нулю: The parameters dictionary contains a null entry for parameter 'programId' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ActionResult CheckCourses(Int32, System.String, System.Nullable 1[System.Int32])' in 'TanulmanyiRendszer.Controllers.HomeController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter. Parameter name: parameters

Полная трассировка стека:

[ArgumentException: The parameters dictionary contains a null entry for parameter 'programId' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ActionResult CheckCourses(Int32, System.String, System.Nullable`1[System.Int32])' in 'TanulmanyiRendszer.Controllers.HomeController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.
Parameter name: parameters]
   System.Web.Mvc.ActionDescriptor.ExtractParameterFromDictionary(ParameterInfo parameterInfo, IDictionary`2 parameters, MethodInfo methodInfo) +527
   System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +91
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +27
   System.Web.Mvc.Async.AsyncControllerActionInvoker.<BeginInvokeSynchronousActionMethod>b__39(IAsyncResult asyncResult, ActionInvocation innerInvokeState) +22
   System.Web.Mvc.Async.WrappedAsyncResult`2.CallEndDelegate(IAsyncResult asyncResult) +29
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) +32
   System.Web.Mvc.Async.AsyncInvocationWithFilters.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3d() +50
   System.Web.Mvc.Async.<>c__DisplayClass46.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3f() +225
   System.Web.Mvc.Async.<>c__DisplayClass33.<BeginInvokeActionMethodWithFilters>b__32(IAsyncResult asyncResult) +10
   System.Web.Mvc.Async.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult) +10
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult) +34
   System.Web.Mvc.Async.<>c__DisplayClass2b.<BeginInvokeAction>b__1c() +26
   System.Web.Mvc.Async.<>c__DisplayClass21.<BeginInvokeAction>b__1e(IAsyncResult asyncResult) +100
   System.Web.Mvc.Async.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult) +10
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +27
   System.Web.Mvc.Controller.<BeginExecuteCore>b__1d(IAsyncResult asyncResult, ExecuteCoreState innerState) +13
   System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +29
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
   System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +36
   System.Web.Mvc.Controller.<BeginExecute>b__15(IAsyncResult asyncResult, Controller controller) +12
   System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +22
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
   System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +26
   System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +10
   System.Web.Mvc.MvcHandler.<BeginProcessRequest>b__5(IAsyncResult asyncResult, ProcessRequestState innerState) +21
   System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +29
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
   System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +28
   System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +9
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +9765045
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155

ОБНОВЛЕНИЕ

Контроллер по запросу:

public class HomeController : BaseController
{
    public ActionResult Index()
    {
        return View("Index", _programService.Programs.ToList());
    }

    public ActionResult CheckCourses(int programId, string searchString, int? page) {
        var courses = from s in _courseService.Courses select s;
        if (searchString != null)
        {
            page = 1;
        }

        ViewBag.CurrentFilter = searchString;
        ViewBag.ProgramId = programId;

        if (!String.IsNullOrEmpty(searchString))
        {
            searchString = searchString.ToLower();
            courses = courses.Where(s => s.CrsName.ToLower().Contains(searchString) || s.EducationUser.FullName.ToLower().Contains(searchString));
        }
        courses = courses.OrderBy(s => s.Id);
        int pageSize = 20;
        int pageNumber = (page ?? 1);

        return View("Courses",courses.ToPagedList(pageNumber, pageSize));
    }

}

ОБНОВЛЕНИЕ 2

Визуализированный элемент <form> показывает, что функция работала хорошо, однако проблема все еще сохраняется при нажатии кнопки поиска:

<form action="/Home/CheckCourses?programId=2" method="get">            
    <p class="col-md-12">
        Find by course or teacher name: <input id="SearchString" name="SearchString" type="text" value="">
    <input type="submit" value="Search Course" class="btn-primary">
    </p>
</form>

  • Можете ли вы также вставить метод контроллера HTTPGet для этого представления? 25.04.2017
  • @MichaelBurns Я добавил контроллер действий CheckCourses 25.04.2017
  • попробуйте явно преобразовать programId в int, например new { programId = (int)ViewBag.ProgramId }. 25.04.2017
  • Можете ли вы пропустить обработанный HTML-код для элемента формы? Вы также можете попробовать добавить html.hiddenfor<> для идентификатора программы как wll 25.04.2017
  • @lte__ Какой метод контроллера используется для визуализации представления формы и добавления исходного ViewBag.ProgramId? Используете ли вы один и тот же метод CheckCourses для отображения формы поиска и отправки строки поиска? 25.04.2017
  • @MadMyche Apparenlty <form> отображается хорошо (см. Обновление 2). 25.04.2017
  • @MichaelBurns Представление Courses.cshtml вызывается из другого представления через @Html.ActionLink("Check courses", "CheckCourses", "Home", new { programId = Model[i].Id, currentFilter = "", searchString = "", page = 1}, new { @class = "btn btn-primary" }), и форма находится в этом Courses.cshtml 25.04.2017
  • Если я вручную ввожу http://localhost:56272/Home/CheckCourses?programId=2&SearchString=dat, он работает нормально, но если я нажимаю эту кнопку Search course, он вызывает http://localhost:56272/Home/CheckCourses?SearchString=dat, даже если форма явно содержит programID ... Я этого не понимаю: D 25.04.2017
  • @lte__Все выглядит правильно, насколько я могу судить. Можете ли вы поместить точку останова в свой метод CheckCourses и посмотреть, что отправляется этому методу? 25.04.2017
  • @MichaelBurns Я звонил, но забавно, что CheckCourses() не звонят ... 25.04.2017
  • Это def вызывается, ошибка даже возвращается для этого метода CheckCourses. 25.04.2017
  • Я поставил точку останова перед public ActionResult CheckCourses(int programId, string searchString, int? page), но ничего. Прыгает прямо на трассировку стека, не ломается ... 25.04.2017

Ответы:


1

Попробуйте переместить параметр programId в скрытое поле:

@using (Html.BeginForm("CheckCourses", "Home", FormMethod.Get)){
    <p class="col-md-12">
        @Html.Hidden("programId", ViewBag.ProgramId)
        Find by course or teacher name: @Html.TextBox("SearchString", ViewBag.CurrentFilter as string)
        <input type="submit" value="Search Course" class="btn-primary" />        
    </p>
}
25.04.2017
  • Ого, вот и все (с int вместо string). Вы можете объяснить почему? 25.04.2017
  • Оказалось, что когда вы нажимаете на поиск, он перезаписывал ваш существующий параметр programId, когда вы объявляли его во вспомогательном методе BeginForm. 25.04.2017
  • Когда вы используете FormMethod.Get, любые значения параметров перезаписываются данными формы: stackoverflow.com/questions/1116019/ и stackoverflow.com/questions/3548795 / 25.04.2017
  • Думаю, мой комментарий за полчаса до того, как этот ответ был правильным: добавьте html.hiddenfor<> для идентификатора программы 25.04.2017
  • (int) не требуется, так как все данные в строке запроса имеют тип string, допускающий значение NULL, отсюда и название. 25.04.2017
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..