Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 根据用户选择从不同控制器切换操作的最佳方法_Asp.net Mvc - Fatal编程技术网

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

Asp.net mvc 根据用户选择从不同控制器切换操作的最佳方法,asp.net-mvc,Asp.net Mvc,我正在使用一个屏幕,该屏幕需要根据所选“付款方式””执行付款,并为每个付款方式显示一个复选框,如下图所示 最重要的是,每种支付方式都有其自己的逻辑,基于各自提供给我们的API,其中一些支付方式需要重定向URL以登录其站点(即PayPal),而另一些支付方式只需指定一些凭据并执行支付本身。因此,根据这一点,我们被迫为每个控制器创建一个控制器,以便在用户选择一个选项后委托与他进行交互。更清楚地说,它将是这样的: public class PayPalController : BaseContro

我正在使用一个屏幕,该屏幕需要根据所选“付款方式””执行付款,并为每个付款方式显示一个复选框,如下图所示

最重要的是,每种支付方式都有其自己的逻辑,基于各自提供给我们的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有一个字符串,它将作为所选选项用于重定向URL。例如:“贝宝”或“印度银行”

视图显示一个begin表单,该表单将发布到一个中间控制器,该控制器将根据所选选项执行另一个重定向

@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" />
}
选项2:包括直接从视图的客户端重定向操作,而不经过中间控制器,在这种情况下,中间控制器只存在于获取视图时

视图将由PaymentMethodController获取,但“PaymentMethod”操作的发布将由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>
@model.Bollore.IES.Web.Models.PaymentMethodViewModel
@{
ViewBag.Title=“付款方式”;
Layout=“~/Views/Shared/_Layout.cshtml”;
}
//复选框和所有东西的列表
函数callPaymentMethodAction(e){
var selectedMethodUrl=GetMethodSelectedUrl();//它将返回“PayPal”、“BankofAgola”等
$.ajax({
url:“selectedMethodUrl”,
数据:{id:id},
成功:函数(){
警报(“已付款”);
}
});
};
我重复一遍,这是一个无法编译的伪代码,但我希望您能理解

那么,这两种方法中,哪一种是处理此类问题的最佳方法 这您如何管理事实,以便能够调用多个 视图中的控制器


如果您想重定向到视图,那么ajax似乎不合适(ajax调用停留在同一页面上)。我怀疑你想要单选按钮(而不是复选框,它允许选择多种付款方式)。单选按钮的值应该是控制器的名称(最好是一个指示付款方式的枚举值),这正是您所说的!视图将有单选按钮而不是复选框。。。那是因为这是一个视图的模型。那么,根据你的回答,你是说最好使用中间控制器的选项1?
 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);
    }
 }
@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>