在 viewmodel 中更改 ModelState(添加自定义验证)
Change ModelState In viewmodel(Add Custom Validation)
我是 Web 编程的新手,我不得不使用 Jquery 数据时间插件。我在数据时间转换方面遇到了很多问题,所以我做了一个简单但奇怪而冗长的逻辑来处理它。
而不是创建 One DateTime 属性。我做了两个,一个是字符串,另一个是 ViewModel
中可为空的 Datetime
注意:所有代码都是用ViewModel写的
public DateTime? InitialStartDate
{
get
{
return istartDate;
}
set
{
istartDate = value;
}
}
public string IStartDateString
{
get
{
if (istartDate == null)
{
return "";
}
else
{
return istartDate.Value.ToString("MM/dd/yyyy");
}
}
set
{
if (string.IsNullOrEmpty(value))
{
istartDate = null;
}
else
{
DateTime TempDate=DateTime.Min;
if(DateTime.TryParseExact(value, "MM/dd/yyyy", CultureInfo.InvariantCulture, out TempDate)
{
InitialStartDate=TempDate;
}
else{
InitialStartDate=null;
ErrorMessage="Can not convert date";
}
}
}
}
请教我怎么处理才好
其次
例如这个逻辑很好,然后我想添加 ModelState Error。例如
if(DateTime.TryParseExact(value, "MM/dd/yyyy", CultureInfo.InvariantCulture, out TempDate)
{
InitialStartDate=TempDate;
}
else{
InitialStartDate=null;
ModelState.AddError('Date is not right ');
}
有没有类似的东西。请帮助并非常感谢您阅读我所有的问题:)
例如我这样解析它
InitialStartDate= DateTime.ParseExact(value, "MM/dd/yyyy", CultureInfo.InvariantCulture);
值为 1/1/201
它会抛出异常。我不希望它抛出异常但添加验证错误,所以稍后在控制器中检查 ModelState.IsValid
它 returns 错误,我可以在视图中显示它。
@Html.LabelFor(model => model.InitialStartDate, htmlAttributes: new { @class = "control-label col-offset-2" })
@Html.TextBoxFor(model => model.IStartDateString, new { @id = "initialstartdate", value = Model.IStartDateString, @class = "form-control", tabindex = "34" })
@Html.ValidationMessageFor(model => model.InitialStartDate, "", new { @class = "text-danger" })
我正在从视图中设置它的值。
我模型中的所有其他属性。我有这个
[DataType(DataType.Date)]
public DateTime? StartTime { get; set; }
试试这个
$(function() {
$("#datepicker").datepicker({
changeMonth: true,
changeYear: true,
yearRange: '2011:2037',
dateFormat: 'dd/mm/yy',
minDate: 0,
defaultDate: null
}).on('change', function() {
$(this).valid(); // triggers the validation test
// '$(this)' refers to '$("#datepicker")'
});
});
希望对你有所帮助
使用 try-catch 块并将 ModelState.AddModelError
添加到您的代码中:
查看
<script type="text/javascript">
$(document).ready(function() {
$("#initialstartdate").datepicker({
changeMonth: true,
changeYear: true,
dateFormat: 'MM/dd/yyyy',
minDate: 0,
defaultDate: null
// see jQuery datepicker docs for more attributes
}).change(function() {
$(this).valid(); // validation test
});
});
</script>
<!-- EditorFor used to include datetime as is -->
@Html.EditorFor(model => model.IStartDateString, new { @id = "initialstartdate", value = Model.IStartDateString, @class = "form-control", tabindex = "34" });
控制器
try {
if(DateTime.TryParseExact(value, "MM/dd/yyyy", CultureInfo.InvariantCulture, out TempDate)
{
InitialStartDate=TempDate;
}
else
{
InitialStartDate = null;
ModelState.AddModelError("Date is not right");
}
}
catch (ArgumentException e)
{
ModelState.AddModelError("Date is not right");
}
ModelState.AddModelError
将使 ModelState
无效,因此 IsValid
属性 在返回您的视图时变为 false
。
可能这与您当前的需求相去甚远,因此欢迎任何建议。
我是 Web 编程的新手,我不得不使用 Jquery 数据时间插件。我在数据时间转换方面遇到了很多问题,所以我做了一个简单但奇怪而冗长的逻辑来处理它。 而不是创建 One DateTime 属性。我做了两个,一个是字符串,另一个是 ViewModel
中可为空的 Datetime注意:所有代码都是用ViewModel写的
public DateTime? InitialStartDate
{
get
{
return istartDate;
}
set
{
istartDate = value;
}
}
public string IStartDateString
{
get
{
if (istartDate == null)
{
return "";
}
else
{
return istartDate.Value.ToString("MM/dd/yyyy");
}
}
set
{
if (string.IsNullOrEmpty(value))
{
istartDate = null;
}
else
{
DateTime TempDate=DateTime.Min;
if(DateTime.TryParseExact(value, "MM/dd/yyyy", CultureInfo.InvariantCulture, out TempDate)
{
InitialStartDate=TempDate;
}
else{
InitialStartDate=null;
ErrorMessage="Can not convert date";
}
}
}
}
请教我怎么处理才好
其次
例如这个逻辑很好,然后我想添加 ModelState Error。例如
if(DateTime.TryParseExact(value, "MM/dd/yyyy", CultureInfo.InvariantCulture, out TempDate)
{
InitialStartDate=TempDate;
}
else{
InitialStartDate=null;
ModelState.AddError('Date is not right ');
}
有没有类似的东西。请帮助并非常感谢您阅读我所有的问题:)
例如我这样解析它
InitialStartDate= DateTime.ParseExact(value, "MM/dd/yyyy", CultureInfo.InvariantCulture);
值为 1/1/201 它会抛出异常。我不希望它抛出异常但添加验证错误,所以稍后在控制器中检查 ModelState.IsValid 它 returns 错误,我可以在视图中显示它。
@Html.LabelFor(model => model.InitialStartDate, htmlAttributes: new { @class = "control-label col-offset-2" })
@Html.TextBoxFor(model => model.IStartDateString, new { @id = "initialstartdate", value = Model.IStartDateString, @class = "form-control", tabindex = "34" })
@Html.ValidationMessageFor(model => model.InitialStartDate, "", new { @class = "text-danger" })
我正在从视图中设置它的值。
我模型中的所有其他属性。我有这个
[DataType(DataType.Date)]
public DateTime? StartTime { get; set; }
试试这个
$(function() {
$("#datepicker").datepicker({
changeMonth: true,
changeYear: true,
yearRange: '2011:2037',
dateFormat: 'dd/mm/yy',
minDate: 0,
defaultDate: null
}).on('change', function() {
$(this).valid(); // triggers the validation test
// '$(this)' refers to '$("#datepicker")'
});
});
希望对你有所帮助
使用 try-catch 块并将 ModelState.AddModelError
添加到您的代码中:
查看
<script type="text/javascript">
$(document).ready(function() {
$("#initialstartdate").datepicker({
changeMonth: true,
changeYear: true,
dateFormat: 'MM/dd/yyyy',
minDate: 0,
defaultDate: null
// see jQuery datepicker docs for more attributes
}).change(function() {
$(this).valid(); // validation test
});
});
</script>
<!-- EditorFor used to include datetime as is -->
@Html.EditorFor(model => model.IStartDateString, new { @id = "initialstartdate", value = Model.IStartDateString, @class = "form-control", tabindex = "34" });
控制器
try {
if(DateTime.TryParseExact(value, "MM/dd/yyyy", CultureInfo.InvariantCulture, out TempDate)
{
InitialStartDate=TempDate;
}
else
{
InitialStartDate = null;
ModelState.AddModelError("Date is not right");
}
}
catch (ArgumentException e)
{
ModelState.AddModelError("Date is not right");
}
ModelState.AddModelError
将使 ModelState
无效,因此 IsValid
属性 在返回您的视图时变为 false
。
可能这与您当前的需求相去甚远,因此欢迎任何建议。