验证模型中的某个属性是否高于另一个属性

本文关键字:属性 是否 高于 另一个 模型 验证 | 更新日期: 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>

我有很多问题:

  1. 首先,我需要保持QtyToShow,因为它以后将用于数据管理,但是由于HTTPPost,数据不能在模型中存活;
  2. 我还需要验证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/