我有一个使用类似代码的MVC应用程序。我使用JS单击按钮添加了日期字段。
型号:
public class FruitViewModel
{
public Guid Id { get; set; }
public string Name { get; set; }
public List<FruitDate> DateList {get;set;}
}
public class FruitDate
{
[DataType(DataType.Date, ErrorMessage = "Invalid Date")]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public DateTime BuyDate{get;set;}
[DataType(DataType.Date, ErrorMessage = "Invalid Date")]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public DateTime SellDate{get;set};
}
我的观点:
<input asp-for="Id" type="hidden">
<button id="btnAdd" type="button" value="Add row" class="btn btn-default">Save Changes</button>
<button id="btnSave" type="submit" value="Save Changes" class="btn btn-default">Save Changes</button>
<div id="divFruits" class="row">
</div>
JS
$(document).on('click', '#btnSubmit', function (e) {
let newDiv = '<div class="row"><div class="col-md-12"> +
'<div class="col-xs-6"><input class="form-control" type="date" data-val="true" data-val-required="The BuyDate field is required." id="DateList_0__BuyDate" name="DateList[0].BuyDate" value="' + currentdate + '"> </div>' +
'<div class="col-xs-6"><input class="form-control" type="date" data-val="true" data-val-required="The SellDate field is required." id="DateList_0__SellDate " name="DateList[0].SellDate " value="' + currentdate + '"></div>' +
'</div ></div >'
$('#divFruits').append(newDiv);
});
单击按钮会在divFruits中添加新行,并且所有这些工作正常。
提交后,将转到控制器,代码如下。
[HttpPost]
public ActionResult SaveFruits(FruitViewModel model)
{
try
{
if (ModelState.IsValid)
{
}
var allErrors = ModelState.Values.SelectMany(v => v.Errors.Select(b => b.ErrorMessage));
ModelState.AddModelError("", "An error occured. Please try again");
}
}
它一直正常工作,并且“购买和出售日期”已绑定到模型。在无效的买入或卖出日期,例如02/31/3019,模型状态会按预期失败。但是,allErrors变量具有消息
值“”无效。
为什么我没有得到无效字段的名称,例如值'FruitDate [0] .BuyDate'无效。
答案 0 :(得分:0)
您没有获得字段名称,因为DataType
属性在从发布数据绑定到模型之前未验证。
要使您的Required
属性有效,您必须将DateTime
字段更改为可空:
public DateTime? BuyDate{get;set;}
public DateTime? SellDate{get;set};