這是一直困惑着我最好的方法,同時保持可維護的代碼。下面的代碼爲支付網關表單設置一個月和年的列表,然後將它們分配給類型爲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列表。然後你可以使用它而不用重寫它兩個地方。 –