2012-07-09 87 views
1

我有一个“添加到购物车”按钮,如果浏览器支持JS + Ajax(并没有关闭)它使用Ajax的POSTS回到网站,但是如果他们不支持它,或者将它关闭,它会执行手动样式POST。不同视图的Ajax回发没有复制控制器

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

我宁愿不必重复控制器/操作代码两次,它看起来不够优雅。

是否有针对此类问题的建议解决方案或模式?

回答

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

在控制器中可以有两种不同的操作。一个用于常规邮件,另一个用于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 
} 
+0

这是我希望避免的模式(即具有两个代码块确实是一样的东西,但我想我可能不得不使用它)。我知道它可能不是,但它只是感到肮脏,有两个地点回到。 – 2012-07-09 11:01:57

相关问题