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