0

次の 2 つのプロパティを含むこのモデルがあります。

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 開発の経験があまりないため、どうすればよいかわかりません。あなたは私を助けることができます?ありがとうございました。

4

2 に答える 2

3

これを行うには 2 つの方法があります。

  • コントローラーでデータを手動で検証する
  • カスタムバリデータを書く

最初の方法は最も簡単で、2 番目の方法はより良い方法です。

軌道に乗ってアプリを機能させるには、最初の方法を実装してから、mvc に慣れてきたら戻ってリファクタリングします。

ビューモデルにプロパティを追加します

public string QuantityValidationMsg {get; set}

次に、ビューにメッセージを表示します

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

次に、投稿アクションで( btwList<yourViewModel>ではなくaを受け入れる必要があります)List<int>

viewModel.QuantityValidationMsg = null;
if (viewModel.QtyToShow > viewModel.NbrInStock)
{
  viewModel.QuantityValidationMsg = "Error Message!";
}

ValidationAttribute 2 番目のアプローチでは、次の行に沿って何かを実装および定義する新しいクラスを作成します。

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)
于 2013-03-11T20:02:49.327 に答える
1

この種のことは、このようなアドホック ルール用に作成したカスタム属性である Mkay で表現するのが非常に簡単です。ナゲットパッケージとして入手できます。インストール後、次のようにモデル プロパティに注釈を付けるだけです。

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

興味があれば、私のブログで Mkay の仕組みについて詳しく読むことができます

于 2013-03-11T21:00:18.120 に答える