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我将在其他项目中使用它。但在这里,我想我只能使用3if..else
块。在当前的应用程序中,我只有一个这样的场景。不适用于重用。我认为当您在多个地方有我的示例场景时,您的代码是一个很好的候选者。然后您必须使用3if..else
这样的条件:if(index<0 | | index>=list.Count)
但用户最多可以选择3,意思是1、2或3。条件不完全是3,而是@Alexandru IonutMihai,这对我的场景来说是一个额外的工作。但这是一个很好的例子,可能是为了将来的工作,可能有几个这样的场景,我们可以在需要的地方重用您的扩展。其他人也可能从中受益。你为什么不使用它呢?@AlexandruIonutmihai我将在其他项目中使用它。但在这里,我想我只能使用3if..else
块。在当前的应用程序中,我只有一个这样的场景。不适用于重用。我认为当你在多个地方有我的例子的场景时,你的代码是一个很好的候选者。然后你必须使用3if..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个项目,代码确实可以正常工作。这是否在表单的标记帮助器中?根据助手的嵌套方式,如果使用强类型助手,它们应该生成隐藏的表单输入,这将确保