验证模型中的某个属性是否高于另一个属性
本文关键字:属性 是否 高于 另一个 模型 验证 | 更新日期: 2023-09-27 18:03:18
我有这个模型,它包含以下两个属性:
public int m_ID
public int m_NbrInStock
public int m_QtyToShow
这是我实际渲染我的视图:
<script src="/Scripts/jquery-1.7.1.min.js"
type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function() {
$("#selectAll").click(function ()
{
var chkValue = $(this).is(":checked");
$(".divChckBox").prop("checked", chkValue);
});
});
</script>
<p>
@using (Html.BeginForm("SendItems", "Inventory"))
{
<p>
Select / UnSelet All Items @Html.CheckBox("selectAll", true)
</p>
<table>
<tr>
<th>Obj Name</th>
<th>Number In Stock</th>
(...)
<th>Quantity</th>
</tr>
@for (int i = 0; i < Model.Count(); i++)
{
<tr>
<td>@Html.DisplayFor(x => x[i].m_Card.m_CardName)</td>
<td>@Html.DisplayFor(x => x[i].m_NbInStock)</td>
(...)
<td>
<input type="checkbox" name="itemSending" class="divChckBox" checked="true" value="@Model[i].m_ID"/>
</td>
<td>@Html.TextBoxFor(x => x[i].m_QtyToShow</td>
</tr>
}
</table>
<div class="float-right">
<input type="submit" value="Send"/>
</div>
}
</p>
我有很多问题:
- 首先,我需要保持QtyToShow,因为它以后将用于数据管理,但是由于HTTPPost,数据不能在模型中存活;
- 我还需要验证QtyToShow永远不会高于m_NbrInStock或显示错误消息,如果是这种情况。
这不是一个简单的任务,因为我没有太多的MVC开发经验,我不知道我怎么能做到这一点。你能帮我吗?谢谢你。
有两种方法:
- 在控制器中手动验证数据 编写自定义验证器
第一个是最简单的,第二个是更好的实践。
为了让你的应用正常工作,你可以先实现第一种方式,当你对mvc更熟悉的时候再回来重构。
所以给你的viewModel添加一个属性
public string QuantityValidationMsg {get; set}
然后在视图中显示消息
<td>@Html.TextBoxFor(x => x[i].m_QtyToShow
<span>@Html.DisplayFor(x => x[i].m_QuantityValidationMsg)</span></td>
然后在您的post action中(需要接受List<yourViewModel>
, 而不是 List<int>
,顺便说一句)
viewModel.QuantityValidationMsg = null;
if (viewModel.QtyToShow > viewModel.NbrInStock)
{
viewModel.QuantityValidationMsg = "Error Message!";
}
对于第二种方法,您将创建一个实现ValidationAttribute
的新类然后定义如下行:
public class ValidateQuantity : ValidateAttribute
{
private const string MESSAGE = "Error Message";
public ValidateQuantity (int qtyInput, int qtyConfirm)
: base( MESSAGE )
{
Input = qtyInput;
Confirm = qtyConfirm;
}
public int Input {get; private set;}
public int Confirm {get; private set;}
public override bool IsValid (object value)
{
var properties = TypeDescriptor.GetProperties(value);
var input = properties.Find(Input, false).GetValue(value);
var confirm = properties.Find(Confirm, false).GetValue(value);
if( input > confirm)
{
return false;
}
return true;
}
}
然后用新属性
修饰model属性public int m_ID
public int m_NbrInStock
[ValidateQuantity]
public int m_QtyToShow
并在视图
中添加验证消息@Html.ValidationMessageFor(m => m.m_QtyToShow)
这种事情在Mkay中非常容易表达,这是我为这样的特殊规则编写的自定义属性。它是一个nuget包。安装之后,您所需要做的就是像这样注释您的模型属性:
[Mkay(">= m_NbrInStock")]
public int m_QtyToShow
如果你感兴趣,你可以在我的博客上阅读更多关于Mkay如何工作的信息:https://einarwh.wordpress.com/2013/02/15/mkay-one-validation-attribute-to-rule-them-al/