我有一個「添加到購物車」按鈕,如果瀏覽器支持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