MVC控件在没有页面刷新的情况下无法正常工作



我有一个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语句中来解决这个问题。

最新更新