2011-04-07 76 views
0

我有一个ExtJs formpanel与standardSubmit:false。在提交时,控制器将验证formdata,因为某些验证将在服务器上进行(例如,检查名称是否唯一)。如果提供的实体无效,则将JsonResult发送给客户端以通知用户哪些字段无效。这是完美的。如果实体有效,它将被存储在数据库中,并且控制器必须将用户重定向到特定的视图。控制器必须提供JsonResult或重定向到查看

其结果是,视图提供的HTML被发送到期望JSON响应的客户端。显然,这是行不通的。

public override ActionResult Create(FormCollection formCollection) 
    { 
     Models.Relatie relatie = Repository.CreateNew(); 
     SetFormValues(relatie, formCollection); 

     if (ModelState.IsValid) 
     { 
      _relatieService.CreateRelation(relatie); 
      ViewResult view = View("Index"); 
      return view; //pumps html while client expects JSON 
     } 
     else 
     { 
      JsonResult json = Json(new { success = false, errors = ModelState.ToDictionary() }); 
      return json; 
     } 
    } 

我一直在寻找超过8小时的解决方案现在,任何人都可以请我帮忙吗?

回答

0

发回一个JSON对象,其success属性设置为true。在AJAX调用中的成功处理程序中检查此内容,并使用javascript(window.location = indexLink)重定向。

值得关注的是,如果你想生成的链接服务器端和您使用的web表单视图引擎,你需要做这样的事情在网页中嵌入的脚本变量:

<%= "<script language=\"javascript\"> var indexLink = \"" + Url.Action("Index") + "\";</script>" %> 

然后,您可以在页面中使用indexLink

+0

谢谢,这个主意很有效!我实际上已经在JsonResponse对象中提供了重定向链接,因此它将在服务器上确定。一个非常小的违反MVC范例,但我可以接受。它仍然看起来很干净。 – Paul77 2011-04-07 11:50:05

+0

这是稍微的但IMO AJAX不应该用于控制MVC应用程序中的应用程序流。同样,创建视图应该真正重定向到索引而不是返回HTML。 – 2011-04-07 12:55:30

+0

确保javascript重定向使用'href'属性来使其在所有浏览器中都能正常工作。例如。 'window.location.href = indexLink' – Eric 2011-08-10 21:41:31