我的Post method
应用中的ASP.NET MVC Core 1.1
后面会向数据库添加记录。只要用户从exactly
中选择multi-select dropdown
3个订单类型,该方法就会成功添加记录。用户应从下拉列表中选择at most
3个订单类型。因此,如果用户选择少于3个订单类型,则按预期抛出众所周知的错误:Index was outside the bounds of the array
。 问题:如果用户选择less than 3
订单类型,如何避免上述错误。我想我可以将整个var oOrder = new Order{...}
语句放在if...else..
的每个块中,以避免错误。但在实际情况中,有更多的模型属性,因此在if...else...
块中重复3次会使代码看起来比实际更复杂。有没有更好的方法呢?
[HttpPost]
public IActionResult AddOrder(OrderViewModel model)
{
if (ModelState.IsValid)
{
var oOrder = new Order
{
orderName = model.orderName,
StartDate = model.StartDate,
EndDate = model.EndDate,
....
....
lkupType_1_ID = model.SelectedTypeIDs[0],
lkupType_2_ID = model.SelectedTypeIDs[1],
lkupType_3_ID = model.SelectedTypeIDs[2],
....
};
_context.Add(oOrder);
}
return RedirectToAction(....);
}
更新:
视图的快照
....
<div>....</div>
....
<div class="form-group">
<label asp-for="SelectedOrderTypeIDs"></label>
<div class="col-md-10">
<select asp-for="SelectedOrderTypeIDs" asp-items="Model.lstOrderTypes"></select>
</div>
</div>
<button type="submit" name="submit">Add Order</button>
注意:我正在使用ASP.NET MVC tag helpers并经常使用@Shyju
中的this post作为多选标记帮助程序的好例子。
答案 0 :(得分:0)
您可以使用Length
属性来检查SelectedTypeIDs
列表中的项目数。
if(model.SelectedTypeIDs.Length>3){
//code
}
如果条件为false
,您可以使用ModelState.AddModelError
方法在查看中显示error
。
if(model.SelectedTypeIDs.Length>3){
ModelState.AddModelError("Dropdown", "Error! You must have maximum of 3 options");
return View();
}
<强>更新强>
您可以创建一个generic
函数returns
0,如果index
超出范围,或者改为列表项。
public static TValue GetSafe<TItem>(this IList<TItem> list,
int index, TValue defaultValue)
{
if (index < 0 || index >= list.Count)
{
return defaultValue;
}
return list[index];
}
现在您可以使用此功能来实现您的功能。
var oOrder = new Order
{
orderName = model.orderName,
StartDate = model.StartDate,
EndDate = model.EndDate,
....
....
lkupType_1_ID =model.SelectedTypeIDs.GetSafe(0, 0) ,
lkupType_2_ID =model.SelectedTypeIDs.GetSafe(1, 0) ,
lkupType_3_ID =model.SelectedTypeIDs.GetSafe(2, 0) ,
....
};
答案 1 :(得分:0)
您可以在下面尝试if
作为tenary运营商:
[HttpPost]
public IActionResult AddOrder(OrderViewModel model)
{
if (ModelState.IsValid)
{
var oOrder = new Order
{
orderName = model.orderName,
StartDate = model.StartDate,
EndDate = model.EndDate,
....
....
lkupType_1_ID = (model.SelectedTypeIDs.Length > 0) ? model.SelectedTypeIDs[0] : 0, // You can default it to null if it is Int?
lkupType_2_ID = (model.SelectedTypeIDs.Length > 1) ? model.SelectedTypeIDs[1] : 0,
lkupType_3_ID = (model.SelectedTypeIDs.Length > 2) ? model.SelectedTypeIDs[2] : 0,
....
};
_context.Add(oOrder);
}
return RedirectToAction(....);
}