我正在尝试使用Ajax.BeginForm功能。
表单已正确发布,但我需要从控制器操作中以json格式检索数据,并使用操作结果消息刷新 div 。
我在Stackoverflow中找到了一些建议,但没有一个是有用的。
这是一个建议:
var data = content.get_response().get_object();
But it didn't work for me。我相信今天已被弃用,仅适用于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;
}
}
答案 0 :(得分:6)
为我们获得最佳解释的解释可能是:
当我们使用OnComplete和JSON时,响应将直接嵌入到页面的DOM中。为此目的,建议使用OnSuccess和OnFailure。那些实际上处理来自控制器动作的完美JSON结果。
我告诉你们The link that helped me, that was the same I ignored previously,我继续阅读并找到了 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);
}
答案 1 :(得分:0)
有没有办法将结果存储在视图OnComplete JS函数中?
当然,有多种方法来存储控制器收到的数据我建议你使用像backbone.js模型这样的客户端模型。使用backbone.js模型可以在客户端存储格式正确的JSON数据对象和集合。
另一种方法是使用隐藏的浏览器变量,少量数据可以存储在隐藏的输入控件中。
另一种方法是使用基于会话的cookie。
编辑:如果客户端MVC类似于使用了backbone.js,则可能需要重新访问您当前的视图设计。但从长远来看,我认为这是有益的。