繁体   English   中英

使用数组填充MVC模型属性

[英]Populating MVC model properties with an array

在我的ASP.NET MVC Core 1.1应用程序中使用Post method向数据库添加记录。 只要用户从multi-select dropdown exactly选择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标记帮助程序,并经常使用@Shyju 这篇文章作为多选标记帮助@Shyju的好例子。

您可以使用Length属性来检查SelectedTypeIDs列表中的项目数。

if(model.SelectedTypeIDs.Length>3){
   //code
}

如果条件为false ,则可以使用ModelState.AddModelError方法在View中显示error

if(model.SelectedTypeIDs.Length>3){
   ModelState.AddModelError("Dropdown", "Error! You must have maximum of 3 options");
   return View();
}

UPDATE

如果index超出范围,则可以创建returns 0的generic函数,或者创建列表项。

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) ,
            ....
        };

你可以试试下面,一个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(....);
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM