我有一个MVC控制器,可以在几个不同的地方通过表单提交进行调用。然后,控制器呈现一个视图,其主要目的是允许用户发送文档或将其发布到外部网站,以及填写将在通知电子邮件中使用的文本字段。
我正在对这些字段进行验证-用户可以输入自定义主题/正文文本。如果没有,他们将收到一个弹出警报,可以返回到表单,也可以使用占位符值中指示的默认文本提交。
问题是,当用户第一次到达该页面并单击发送按钮时,文本框中没有实际注册的输入,并且无论字段中实际有什么,它都会发出空字符串通知;但是,如果我点击F5并重试,输入将完美工作。
我觉得这与最初调用该控制器的表单提交有关,表单提交是通过POST操作完成的,而它似乎可以很好地处理页面刷新上的GET。我只是不知道如何在通过POST调用控制器时使内容正确响应,或者如何在不发布数据的情况下提交表单。
提前感谢您的阅读和任何帮助。
这是呼叫控制器:
public ActionResult Index(FormCollection collection)
{
//modelbuilding code
return View (Model);
}
调用控制器的代码总是使用以下格式:(在这种情况下,它将从Recipients/Index视图中调用
@using(Html.BeginForm("Index", "Distribution", FormMethod.Post )) {
//form values
<input type="submit" data-role="button" value="Done"/>
}
以下是视图和JS验证函数的相关部分:
<div id="SubjectTemplate">
<p>Subject: <input id="emailSubjectTextBox" name="EmailSubject" placeholder="@EmailSubject" /></p>
</div>
<a href="javascript:validateInput();">Send Notification</a>
<script>
function validateInput() {
var possibleErrors = [];
if (!(document.getElementById('emailSubjectTextBox').value)) {
possibleErrors.push('@incompleteEmailSubject' + 'n');
}
//more validation that works the same way and has the same problem
if (possibleErrors.length > 0) {
if (confirm(possibleErrors))
{
window.location.href = '@Url.Action("Send")'
}
}
else {
window.location.href = '@Url.Action("Send")'
}
}
</script>
我不确定我是否完全理解您的问题,但一般来说,您不应该对POST和GET使用相同的操作。
更重要的是,如果您的操作没有任何副作用,就不应该使用POST。如果你在提交表单时所做的只是做出某种选择,那么你应该使用GET。
有关如何使用jQuery执行ajax GET请求的更多信息和示例,请参阅以下文章:http://www.jquery4u.com/ajax/key-differences-post/
不管您试图做什么,POST调用执行一些操作,然后重定向到返回给用户的GET操作是非常好的做法。
[HttpPost]
public ActionResult Index(FormCollection collection)
{
//do whatever you need to save the record
return RedirectToAction("Index")
}
[HttpGet]
public ActionResult Index()
{
//modelbuilding code
return View (Model);
}
这不仅有助于您的控制器遵守RESTful方法,还可以防止用户在按下f5 时发出恼人的"您确定要重新提交此页面吗">
希望这能有所帮助。
我发现这个问题是由jQueryMobile自动使用AJAX发布表单引起的。我通过将new {data_ajax = "false"}
包含到Html.BeginForm
语句中来解决这个问题。