2013-03-11 71 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