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

C# 验证模型中的某个属性是否高于另一个属性,c#,asp.net-mvc,html,C#,Asp.net Mvc,Html,我有一个包含以下两个属性的模型: 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(

我有一个包含以下两个属性的模型:

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>

$(文档).ready(函数(){
$(“#选择全部”)。单击(函数()
{
var chkValue=$(this).is(“:checked”);
$(.divChckBox”).prop(“选中”,chkValue);
});
});

@使用(Html.BeginForm(“SendItems”、“Inventory”))
{

选择/取消选择所有项目@Html.CheckBox(“selectAll”,true)

对象名称 库存数量 (...) 量 @对于(int i=0;ix[i].m\u Card.m\u CardName) @DisplayFor(x=>x[i].m_NbInStock) (...) @Html.TextBoxFor(x=>x[i].m_QtyToShow } }

我这里有很多问题:

  • 首先,我需要保留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>
    
    对于第二种方法,您将创建一个实现
    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;
      }
    }
    
    然后用新属性装饰模型属性

    public int m_ID
    public int m_NbrInStock
    
    [ValidateQuantity]
    public int m_QtyToShow
    
    并在视图中添加验证消息

    @Html.ValidationMessageFor(m => m.m_QtyToShow)
    
    有两种方法可以做到这一点:

    • 在控制器中手动验证数据
    • 编写自定义验证器
    第一个是最简单的,第二个是更好的练习

    为了让您起步并让您的应用程序正常运行,您可以实现第一种方法,然后在您更熟悉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>
    
    对于第二种方法,您将创建一个实现
    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;
      }
    }
    
    然后用新属性装饰模型属性

    public int m_ID
    public int m_NbrInStock
    
    [ValidateQuantity]
    public int m_QtyToShow
    
    并在视图中添加验证消息

    @Html.ValidationMessageFor(m => m.m_QtyToShow)
    

    这种东西非常容易在Mkay中表达,Mkay是我为类似这样的特殊规则编写的自定义属性。它可以作为nuget包提供。安装后,您只需像这样注释模型属性:

    [Mkay(">= m_NbrInStock")]
    public int m_QtyToShow
    

    如果您感兴趣,可以在我的博客上阅读更多关于Mkay如何工作的信息:

    这种东西非常容易用Mkay表达,这是我为类似这样的特殊规则编写的自定义属性。它可以作为nuget软件包提供。安装后,您只需对模型属性进行如下注释:

    [Mkay(">= m_NbrInStock")]
    public int m_QtyToShow
    

    如果您感兴趣,您可以在我的博客上阅读更多关于Mkay如何工作的信息:

    非常感谢。我将评估我如何处理这个案例以及您提供给我的信息。谢谢!在我处理您的解决方案时,我终于明白,由于我最初没有将列表发送回httppost方法,因此不会进行任何修改保存。更改此设置对我帮助很大!再次感谢。:)非常感谢。我将评估我如何处理这个案子以及你给我的信息。谢谢在处理您的解决方案时,我终于明白,由于我最初没有将列表发送回httppost方法,因此所做的任何修改都不会被保存。改变这一点对我帮助很大!再次感谢你。:)我当然感兴趣,我会马上去读:)我当然感兴趣,我会马上去读:)