3

我正在尝试使用 Ajax.BeginForm 功能。

表单已正确发布,但我需要从控制器操作中检索 json 格式的数据,并使用操作结果消息刷新div 。

我在 Stackoverflow 中找到了一些建议,但没有一个有用。

这是找到的建议:

var data = content.get_response().get_object();

但这对我不起作用。而且我相信今天已弃用,仅适用于 MVC 2 及更低版本。我当前的MVC版本是3

这是一段代码:

<script type="text/javascript">
   function fnCompleted(data){
    if(data.Success)
    $("#somediv").html(data.StatusMessage).addClass("success");
    else
    $("#somediv").html(data.StatusMessage).addClass("error");
   }
</script>

@{
   var ajaxOptions= new AjaxOptions{
                    OnComplete= "fnCompleted",
                    Url= '@Url.Action("myAction", "myController")',
                    Method= "POST"
 }     

<div id="somediv">/*Here goes the json response*/</div>

using(Ajax.BeginForm(ajaxOptions)){

 @Html.EditorForModel()
 <input type="submit" name="send" value="Send">

}

这是我的控制器操作的一部分:

[HttpPost]
 public JsonResult myAction(MyModel mymodel)
 {
  try
        {
            if (myModel== null)
                throw new Exception("The model is empty");
            if (!ModelState.IsValid)
                throw new Exception("The model is wrong");

            var found = /*Look for existence of the model in the database*/;
            if(found)
                throw new Exception("Already exists the object");

            /*Operation with the database*/

            var result = Json(
                new
                {
                    Success = true,//success
                    StatusMessage = "Object created successfully"
                });
            return result;
        }
        catch (Exception exception)
        {
            var result = Json(
                new
                {
                    Success = false,//error
                    StatusMessage = exception.Message
                });
            return result;
        }
   }
4

2 回答 2

7

对我们来说获得最佳解释的解释可能是:

当我们使用 OnComplete 和 JSON 时,响应直接嵌入到页面的 DOM 中。为此,建议使用 OnSuccess 和 OnFailure。这些实际上可以完美地处理来自控制器操作的 JSON 结果。

我将你们汇给帮助我的链接,这与我之前忽略的相同,我继续阅读并找到了Joel Purra 的答案。

在您的 Ajax.BeginForm 中:

new AjaxOptions
{
    **OnFailure** = "onTestFailure",
    **OnSuccess** = "onTestSuccess"
}

脚本块:

<script>
//<![CDATA[

function onTestFailure(xhr, status, error) {

    console.log("xhr", xhr);
    console.log("status", status);       

    // TODO: make me pretty
    alert(error);
}

function onTestSuccess(data, status, xhr) {

    console.log("data", data);
    console.log("status", status);
    console.log("xhr", xhr);

    // Here's where you use the JSON object
    //doSomethingUseful(data);
}
于 2013-02-22T14:35:59.653 回答
0

有没有办法将结果存储在视图 OnComplete JS 函数中?

当然,有多种方法可以存储控制器接收到的数据,我可以建议您使用客户端模型,例如骨干网模型。

使用backbone.js 模型可以在客户端存储格式正确的JSON 数据对象和集合。

另一种方法是使用隐藏的浏览器变量将少量数据存储在隐藏的输入控件中是可行的。

另一种方法是使用基于会话的 cookie。

编辑:如果使用了像backbone.js这样的客户端MVC,可能需要重新访问您当前的视图设计。但从长远来看,我认为这是有益的。

于 2013-02-20T00:20:52.863 回答