我正在使用需要根据所选" 付款方式"执行付款的屏幕。如下所示,您可以在每个模型中看到一个复选框。
最重要的是,每个付款方式都有自己的基于API的逻辑,每个API都提供给我们,其中一些需要重定向URL以便在其网站上登录(即PayPal),以及其他一些只是指定一些凭据并执行付款本身。因此,根据这一点,我们被迫为每个人创建一个控制器,以便在他选择一个选项后委托用户进行交互。更清楚,它将是这样的:
public class PayPalController : BaseController, IPaymentController
{
public ActionResult Pay()
{
//logic for a pay with PayPal
return View("PaymentSuccess");
}
}
public class BankOfNigeriaController : BaseController, IPaymentController
{
public ActionResult Pay()
{
//logic for a pay with Bank Of Nigeria
return View("PaymentSuccess");
}
}
public class BankOfAngolaController : BaseController, IPaymentController
{
public ActionResult Pay()
{
//logic for a pay with Bank Of Angola
return View("PaymentSuccess");
}
}
public interface IPaymentController
{
ActionResult Pay();
}
专注于我暴露在顶部的观点,我想知道哪种调用正确的行动方法是最好的做法。
选项1: 包括创建一个重定向到正确操作的中间控制器。
ViewModel 有一个字符串,它将用作重定向网址作为选定选项。例如:" PayPal"或" BankOfNigeria"。
public class PayPalPaymentViewModel
{
[Required]
public string PaymentSelected { get; set; }
}
视图显示一个开始表单,该表单将POST到中间控制器,根据所选选项将执行另一个重定向。
@model Bollore.IES.Web.Models.PaymentMethodViewModel
@{
ViewBag.Title = "Payment Methods";
Layout = "~/Views/Shared/_Layout.cshtml";
}
@using (Html.BeginForm("RedirectPay", "PaymentMethod", FormMethod.Post))
{
//HTML WITH LIST OF CHECKBOXES
<input type="submit" />
}
MIDDLE控制器在ViewModel中接收所选方法,并重定向到自己的控制器。我没有测试它,目前只是伪代码。
public class PaymentMethodController : BaseController
{
[HttpGet]
public ActionResult RedirectPay()
{
//returns the view
return View();
}
[HttpPost]
public ActionResult RedirectPay(PaymentMethodViewModel model)
{
//it could be "PayPal/Pay" or "BankOfNigeria/Pay", etc.
return RedirectToAction("Pay", model.PaymentSelected);
}
}
选项2: 包括直接从视图的客户端重定向操作,而不通过中间控制器,在这种情况下,它只会存在对于观点的GET。
视图将由PaymentMethodController获取,但POST是&#34;付款方式&#34;动作,将通过javascript完成。
@model Bollore.IES.Web.Models.PaymentMethodViewModel
@{
ViewBag.Title = "Payment Methods";
Layout = "~/Views/Shared/_Layout.cshtml";
}
//LIST OF CHECKBOXES AND ALL THE STUFF
<input id="clickMe" type="button" value="Save" onclick="callPaymentMethodAction();" />
<script type="text/javascript">
function callPaymentMethodAction(e) {
var selectedMethodUrl = GetMethodSelectedUrl(); //it will return 'PayPal', 'BankOfAngola', etc
$.ajax({
url: 'selectedMethodUrl',
data: { id: id },
success: function(){
alert('Payed');
}
});
};
</script>
我重复这是一个无法编译的伪代码,但我希望你明白这一点。
所以,这两个中哪一个是处理问题的最佳方法 这个?如何管理能够调用多个事实的事实 视图中的控制器?