C# 用数组填充MVC模型属性

C# 用数组填充MVC模型属性,c#,asp.net-mvc,asp.net-core-mvc,C#,Asp.net Mvc,Asp.net Core Mvc,在我的ASP.NET MVC Core 1.1应用程序中,遵循Post方法,向数据库添加记录。只要用户从多选下拉列表中准确地选择3种订单类型,该方法就可以成功地添加记录。用户应该从下拉列表中最多选择3种订单类型。因此,如果用户选择的订单类型少于3种,它会如预期的那样抛出众所周知的错误:索引超出了数组的边界问题:如果用户选择的订单类型少于3种,如何避免上述错误。我想我可以将下面的整个var oOrder=neworder{…}语句放在if…else..的每个块中,以避免错误。但在实际场景中,有更多

在我的
ASP.NET MVC Core 1.1
应用程序中,遵循
Post方法
,向数据库添加记录。只要用户从
多选下拉列表中准确地选择
3种订单类型,该方法就可以成功地添加记录。用户应该从下拉列表中最多选择3种订单类型。因此,如果用户选择的订单类型少于3种,它会如预期的那样抛出众所周知的错误:
索引超出了数组的边界问题:如果用户选择的
订单类型少于3种,如何避免上述错误。我想我可以将下面的整个
var oOrder=neworder{…}
语句放在
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,经常使用from
@Shyju
作为多选标记帮助器的示例。

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

if(model.SelectedTypeIDs.Length>3){
   //code
}
如果条件为
false
,则可以使用
ModelState.addmodeleror
方法在视图中显示
错误

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

如果
索引
越界或列表项,您可以创建一个
通用
函数,该函数
返回
0

public static TValue GetSafe<TItem>(this IList<TItem> list, 
int index, TValue defaultValue)
{
    if (index < 0 || index >= list.Count)
    {
       return defaultValue;
    }
    return list[index];
}

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

if(model.SelectedTypeIDs.Length>3){
   //code
}
如果条件为
false
,则可以使用
ModelState.addmodeleror
方法在视图中显示
错误

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

如果
索引
越界或列表项,您可以创建一个
通用
函数,该函数
返回
0

public static TValue GetSafe<TItem>(this IList<TItem> list, 
int index, TValue defaultValue)
{
    if (index < 0 || index >= list.Count)
    {
       return defaultValue;
    }
    return list[index];
}

您可以在下面尝试使用
if
作为十进制运算符:

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

您可以在下面尝试使用
if
作为十进制运算符:

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


但用户最多可以选择
3表示1、2或3。条件不完全是3,而是@Alexandru IonutMihai,这对我的场景来说是一个额外的工作。但这是一个很好的例子,可能是为了将来的工作,可能有几个这样的场景,我们可以在需要的地方重用您的扩展。其他人也可能从中受益。你为什么不使用它呢?@AlexandruIonutmihai我将在其他项目中使用它。但在这里,我想我只能使用3
if..else
块。在当前的应用程序中,我只有一个这样的场景。不适用于重用。我认为当您在多个地方有我的示例场景时,您的代码是一个很好的候选者。然后您必须使用3
if..else
这样的条件:
if(index<0 | | index>=list.Count)
但用户最多可以选择
3,意思是1、2或3。条件不完全是3,而是@Alexandru IonutMihai,这对我的场景来说是一个额外的工作。但这是一个很好的例子,可能是为了将来的工作,可能有几个这样的场景,我们可以在需要的地方重用您的扩展。其他人也可能从中受益。你为什么不使用它呢?@AlexandruIonutmihai我将在其他项目中使用它。但在这里,我想我只能使用3
if..else
块。在当前的应用程序中,我只有一个这样的场景。不适用于重用。我认为当你在多个地方有我的例子的场景时,你的代码是一个很好的候选者。然后你必须使用3
if..else
这样的条件:
if(index<0 | | index>=list.Count)
当我选择,比如说,2时,它仍然给出相同的错误。我认为这是因为,在
三元运算符中
我们仍然要求编译器计算
模型。SelectedTypeId[2]
结果是超出了数组。当我选择,比如说,2时,它仍然给出相同的错误。我认为这是因为,在
三元运算符中
我们仍然要求编译器计算
模型。SelectedTypeId[2]
结果是超出了数组。您是如何构建视图的?默认的modelbinder要求在发布的模型中有不间断的索引,因此如果您没有发布正确的表单值,您的模型将无法正确绑定。@TISONT。我在发布的文章中添加了一个更新来回答您的问题。请记住,对于从下拉列表中选择3个项目,代码确实可以正常工作。这是否在表单的标记帮助器中?根据助手的嵌套方式,如果使用强类型助手,它们应该生成隐藏的表单输入,这将确保(对于集合类型属性)您的索引是从0开始排序的。@TiesonT.Yes它在表单的标记帮助器中,从0开始排序-如果选择3项,则可以正常工作。我指的是发布的数据上的索引-当您看到错误时,我假设这是因为您只发布了类似于
SelectedOrderTypeId[1]
的内容。发生这种情况时,将不绑定整个集合。您可以发布您实际发送的数据的版本吗?您如何构建视图?默认的modelbinder要求在发布的模型中有不间断的索引,因此如果您没有发布正确的表单值,您的模型将无法正确绑定。@TISONT。我在发布的文章中添加了一个更新来回答您的问题。请记住,对于从下拉列表中选择3个项目,代码确实可以正常工作。这是否在表单的标记帮助器中?根据助手的嵌套方式,如果使用强类型助手,它们应该生成隐藏的表单输入,这将确保