我有一个使用查询字符串的链接,它总是转到[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;
...
}
}
答案 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.com,http://example.com/Home或http://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中最好的方法。