使用数组

时间:2017-05-24 22:04:43

标签: c# asp.net-mvc asp.net-core-mvc

我的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作为多选标记帮助程序的好例子。

2 个答案:

答案 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(....);
    }
相关问题