我有一个“添加到购物车”按钮,如果浏览器支持 JS + Ajax(并且没有关闭它),它会使用 Ajax 发布回站点,但是如果他们不支持它,或者将其关闭它执行手动样式的 POST。
我希望完成的是两种视图——一种是用户使用常规 POST 发回,另一种是来自 AJAX POST。这样我就可以显示内嵌消息(部分)或全屏。
我宁愿不必重复控制器/动作代码两次,它看起来不优雅。
对于此类问题,是否有任何推荐的解决方案或模式?
我有一个“添加到购物车”按钮,如果浏览器支持 JS + Ajax(并且没有关闭它),它会使用 Ajax 发布回站点,但是如果他们不支持它,或者将其关闭它执行手动样式的 POST。
我希望完成的是两种视图——一种是用户使用常规 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
}