这是一直困惑着我最好的方法,同时保持可维护的代码。下面的代码为支付网关表单设置一个月和年的列表,然后将它们分配给类型为List<SelectListItem>
的变量。MVC在ModelState.IsValid = false上设置Html.DropdownList
INTIAL行动
PayNowViewModel paymentGateway = new PayNowViewModel();
List<SelectListItem> paymentGatewayMonthsList = new List<SelectListItem>();
List<SelectListItem> paymentGatewayYearsList = new List<SelectListItem>();
for (int i = 1; i <= 12; i++)
{
SelectListItem selectListItem = new SelectListItem();
selectListItem.Value = i.ToString();
selectListItem.Text = i.ToString("00");
paymentGatewayMonthsList.Add(selectListItem);
}
int year = DateTime.Now.Year;
for (int i = year; i <= year + 10; i++)
{
SelectListItem selectListItem = new SelectListItem();
selectListItem.Value = i.ToString();
selectListItem.Text = i.ToString("00");
paymentGatewayYearsList.Add(selectListItem);
}
paymentGateway.ExpiryMonth = paymentGatewayMonthsList;
paymentGateway.ExpiryYear = paymentGatewayYearsList;
return View(paymentGateway);
它的代码公平一点,我发现自己重复这个代码,在类似的格式重新设置的下拉列表中选择应ModelState.IsValid是假的,我想要返回到用户纠正错误的视图。
HttpPost行动 - 代码
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult ConfirmPayment(PayNowViewModel paymentGatewayForm, FormCollection form)
{
if (ModelState.IsValid)
{
// Post processing actions...
return View();
}
else
{
for (int i = 1; i <= 12; i++)
{
SelectListItem selectListItem = new SelectListItem();
selectListItem.Value = i.ToString();
selectListItem.Text = i.ToString("00");
paymentGatewayMonthsList.Add(selectListItem);
}
int year = DateTime.Now.Year;
for (int i = year; i <= year + 10; i++)
{
SelectListItem selectListItem = new SelectListItem();
selectListItem.Value = i.ToString();
selectListItem.Text = i.ToString("00");
paymentGatewayYearsList.Add(selectListItem);
}
form.ExpiryMonth = paymentGatewayMonthsList;
form.ExpiryYear = paymentGatewayYearsList;
return View("MakePayment", form);
}
}
什么是集中显示的下拉菜单设置代码,以便其只在一个地方最好的方法是什么?目前你会看到很大的比例(for循环),重复两次。具有功能的基本控制器?还是像上面那样重新设置会更好?
任何意见赞赏! Mike。
因此,上面的代码是一个算法,可以在整个项目中重复使用,但有一些细微差别? –
这只是一个例子。该特定代码片段被使用两次,一次加载表单,并且如果ModelState无效(例如发送用户返回以更改表单),则从post方法中重新加载表单。我有20个以上的实例,其下拉菜单是这样设置的,然后在模型状态失败时再次重新设置,但是每个代码和类都不同。 –
您可以创建一个辅助类,它包含两个静态方法,GetPaymentMonthList和GetPaymentYearList,它返回适当的SelectListItem列表。然后你可以使用它而不用重写它两个地方。 –