为什么MVC总是使用[HttpPost]方法?

时间:2018-11-11 17:49:59

标签: c# asp.net-mvc

我有一个使用查询字符串的链接,它总是转到[HttpPost]方法而不是[HttpGet]方法。

我得到的错误是TempData [“ surveytype”]上的NullReferenceException,所以我知道它将要发布而不是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 :(得分:0)

我认为您的[HttpGet]使路由变得混乱-删除

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

现在,根据动作名称,路线将得到保护,无论是获取路线还是张贴路线-只是一个解决方案,请尝试一下,让我知道您是否遇到相同的问题

谢谢-编码愉快:)

答案 1 :(得分:0)

对于初学者来说,您不应该手动创建这样的链接。这非常容易出错,并且您经常会遇到这种情况。您应该使用助手来创建链接。例如:

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

接下来,您应该确保没有任何可能干扰基于基于属性的路由或使用MapRoute的自定义路由。

使用帮助程序的最大原因是MVC可以从不同的实际url访问页面,并且很难对这样的路径进行硬编码。

例如,假设您可以访问http://exmample.comhttp://example.com/Homehttp://example.com/Home/Index上的页面。

使用硬编码的“ ../whatever”意味着这将转换为相应的网址http://example.com/../whatever(显然不是您想要的),http://example.com/Home/../Whatever(可能是您想要的,可能不是)或http://example.com/Home/Index/../Whatever(这可能是您想要的,但是除非用户的浏览器URL具有第三个访问该URL的URL,否则它不会到达那里)。

如果必须对链接进行硬编码,则应该始终使用完整的根相对URL链接(“ / Home / whatever”)而不是相对(“ ../whatever”),但是即使这样也会出现问题。如果您决定将站点移至站点的子目录,则会发生这种情况,现在所有的硬编码URL都是错误的。

使用URL助手始终是MVC中最好的方法。