2013-03-11 67 views
0

我有这个模型,它包含以下两个属性:验证,如果在我的模型的属性比其他属性更高

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开发经验,我不知道我该怎么做。你能帮我吗?谢谢。

回答

3

两种方法可以做到这一点:

  • 验证手动将数据在控制器
  • 写自定义验证

第一种是最简单的,第二个是一个更好的做法。

为了让您摆脱困境并让应用程序正常工作,您可以实现第一种方式,然后在您更适合使用mvc时重新进行重构。

所以属性在视图在您的文章操作添加到您的视图模型

public string QuantityValidationMsg {get; set} 

然后显示消息

<td>@Html.TextBoxFor(x => x[i].m_QtyToShow 
<span>@Html.DisplayFor(x => x[i].m_QuantityValidationMsg)</span></td> 

然后(这需要接受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; 
    } 
} 

然后用新的属性

public int m_ID 
public int m_NbrInStock 

[ValidateQuantity] 
public int m_QtyToShow 

装饰模型属性并添加在视图中的验证消息

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

非常感谢你。我会评估我对这个案子和你给我的信息所做的事情。谢谢! – hsim 2013-03-12 11:55:09

+0

当我处理您的解决方案时,我终于明白,由于我原先并未将列表发送回httppost方法,因此所做的任何修改都不会保存。改变这一点帮了我很多!再一次感谢你。 :) – hsim 2013-03-12 12:18:29

1

这种东西在Mkay中非常容易表达,我为这样的特别规则写了om属性。它可以作为nuget包使用。安装完成后,所有你需要做的就是你的注释模型属性是这样的:

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

如果你有兴趣,你可以阅读更多关于Mkay是如何工作的,在我的博客:https://einarwh.wordpress.com/2013/02/15/mkay-one-validation-attribute-to-rule-them-al/

+0

当然我很感兴趣,我会马上去阅读它:) – hsim 2013-03-12 11:55:26