Почему MVC всегда использует метод [HttpPost]? - PullRequest
0 голосов
/ 11 ноября 2018

У меня есть ссылка, которая использует строку запроса, и она всегда идет к методу [HttpPost] вместо метода [HttpGet].

Ошибка, которую я получаю, - это NullReferenceException для TempData ["surveytype"], поэтому я знаю, что она будет отправлять вместо Get. Хотя я понятия не имею, почему.

Я нашел здесь пару похожих вопросов, но ничего не решило мою проблему. Я подумал, что, возможно, MVC интерпретирует это как отправку формы и отправку в HttpPost, потому что я оформляю ссылку как класс "btn btn-primary", но удаление этого ничего не изменило.

Моя ссылка:

<a href="../Responses/Create?SurveyId=@item.id" class="btn btn-primary">Start Response</a>

Контроллер:

       [HttpGet]
        public ActionResult Create(int SurveyId)
        {
            TempData["SurveyId"] = SurveyId;
            return View();
        }


        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create([Bind(Include = ...)] Response response)
        {
            if (ModelState.IsValid)
            {
                response.Userid = User.Identity.GetUserId();
                response.Id = Guid.NewGuid();
                db.response.Add(response);
                db.SaveChanges();
                TempData["ResponseId"] = response.Id;
                int? surveyid = response.SurveyId;
                var surveytype = db.surveys.Find(surveyid).surveytype;
                TempData["surveytype"] = surveytype;
                    ...
    }
    }

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

Для начала, вы не должны вручную создавать подобные ссылки. Это очень подвержено ошибкам, и вы часто сталкиваетесь с такими ситуациями. Вы должны использовать помощников, чтобы создать ссылку. Например:

@Html.ActionLink("Start Responses", "Create", "Controllername", new { SurveyId = item.id }, new { @class = "btn btn-primary" })

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

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

Например, допустим, вы можете получить доступ к странице по номеру http://exmample.com, http://example.com/Home или http://example.com/Home/Index.

Использование жестко закодированного «../whwhat» означает, что это будет переводиться на соответствующий URL-адрес http://example.com/../whatever (очевидно, не то, что вы хотите), http://example.com/Home/../Whatever (может быть тем, что вы хотите, может нет), или http://example.com/Home/Index/../Whatever (это, вероятно, то, что вы хотите, но оно не будет достигнуто, если в URL-адресе браузера пользователя не указан третий URL-адрес для доступа к нему).

Если вам нужно жестко закодировать ссылку, то вы всегда должны использовать полную корневую относительную ссылку URL ("/ Home / what") вместо относительной ("../whwhat"), но даже это имеет проблемы ... что произойдет, если вы решите переместить свой сайт в подкаталог вашего сайта, теперь все ваши жестко запрограммированные URL неверны.

Использование помощников по URL всегда лучший путь в MVC.

0 голосов
/ 11 ноября 2018

Я думаю, что ваш [HttpGet] делает путаницу путаницей - удалите ее

    public ActionResult Create(int SurveyId)
    {
        TempData["SurveyId"] = SurveyId;
        return View();
    }

Теперь, основываясь на названии действия, маршрут позаботится о том, будет ли это получение или публикация - просто попробуйте решение и дайте мне знать, если у вас возникла такая же проблема

Спасибо - Счастливого кодирования:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...