根据用户选择从不同控制器切换操作的最佳方法

时间:2015-03-13 16:46:28

标签: asp.net-mvc

我正在使用需要根据所选" 付款方式"执行付款的屏幕。如下所示,您可以在每个模型中看到一个复选框。

enter image description here 最重要的是,每个付款方式都有自己的基于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>

我重复这是一个无法编译的伪代码,但我希望你明白这一点。

  

所以,这两个中哪一个是处理问题的最佳方法   这个?如何管理能够调用多个事实的事实   视图中的控制器?

0 个答案:

没有答案