2

我有一个 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>
4

2 回答 2

1

我不确定我是否完全理解您的问题,但一般来说,您不应该对 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 时出现烦人的“您确定要重新提交此页面吗”

希望这可以帮助。

于 2012-12-03T19:10:12.573 回答
0

我发现问题是由 jQueryMobile 自动利用 AJAX 发布表单引起的。我通过包含new {data_ajax = "false"}Html.BeginForm语句中解决了这个问题。

于 2012-12-04T21:45:59.180 回答