我有一个“添加到购物车”按钮,如果浏览器支持JS + Ajax(并没有关闭)它使用Ajax的POSTS回到网站,但是如果他们不支持它,或者将它关闭,它会执行手动样式POST。不同视图的Ajax回发没有复制控制器
我希望能够完成的是两个视图 - 一个是当用户使用常规POST发布回来,另一个来自AJAX POST时。这样我可以显示一个内联消息(部分)或全屏。
我宁愿不必重复控制器/操作代码两次,它看起来不够优雅。
是否有针对此类问题的建议解决方案或模式?
我有一个“添加到购物车”按钮,如果浏览器支持JS + Ajax(并没有关闭)它使用Ajax的POSTS回到网站,但是如果他们不支持它,或者将它关闭,它会执行手动样式POST。不同视图的Ajax回发没有复制控制器
我希望能够完成的是两个视图 - 一个是当用户使用常规POST发布回来,另一个来自AJAX POST时。这样我可以显示一个内联消息(部分)或全屏。
我宁愿不必重复控制器/操作代码两次,它看起来不够优雅。
是否有针对此类问题的建议解决方案或模式?
约翰,
您可以使用上的要求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);
}
本书虽然不是也许能给一个完整的解决方案,这应该给你一个良好的开端...
在控制器中可以有两种不同的操作。一个用于常规邮件,另一个用于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
}
这是我希望避免的模式(即具有两个代码块确实是一样的东西,但我想我可能不得不使用它)。我知道它可能不是,但它只是感到肮脏,有两个地点回到。 – 2012-07-09 11:01:57