Ajax回发的不同视图,无需复制控制器

时间:2012-07-09 10:51:17

标签: c# ajax asp.net-mvc-3

我有一个“添加到购物车”按钮,如果浏览器支持JS + Ajax(并且没有关闭它)它使用Ajax返回到站点,但是如果他们不支持它,或者有它关闭它做手动样式POST。

我希望完成的是两个视图 - 一个是用户使用常规POST回发而另一个是来自AJAX POST。这样我就可以显示内嵌消息(部分)或全屏。

我宁愿不必两次复制控制器/动作代码,它看起来似乎不优雅。

针对此类问题是否有任何推荐的解决方案或模式?

2 个答案:

答案 0 :(得分:3)

约翰,

您可以在请求上使用IsAjaxRequest方法来确定这一点。您可以将它应用于您的场景:

public ActionResult AddToCart(YourCartViewmodel cartViewmodel)
{
     if (ModelState.IsValid)
     {
         // do the standard/common db stuff here
         if(Request.IsAjaxRequest())
         {
             return PartialView("myPartialView");
         }
         else
         {
             return View("standardView");
         }
     }
     /* always return full 'standard' postback if model error */
     return View(cartViewmodel);   
}

虽然也许没有提供完整的解决方案,但这应该会给你一个良好的开端......

答案 1 :(得分:1)

您可以在控制器中执行两个不同的操作。一个用于常规帖子,一个用于AJAX。

public ActionResult AddToCart(Viewmodel vm)
{
     if (ModelState.IsValid)
     {
         DoStuff(vm);
         return View("ViewForRegularPost");
     }
     /* error */
     return View(vm);   
}

public ActionResult JsonAddToCart(Viewmodel vm)
{
     if (ModelState.IsValid)
     {
         DoStuff(vm);
         return View("ViewForJS");
     }
     /* error */
     return View(vm);     
}

不是重复控制器代码,而是为实际的控制器代码提供单独的方法。

public void DoStuff(Viewmodel vm)
{
    //TODO : Actual controller code goes here
}