3

MVCは、ビューモデルのクライアント側の検証ルールを生成していません。HTMLには次のものが含まれています。

<script type="text/javascript">
//<![CDATA[
if (!window.mvcClientValidationMetadata) { window.mvcClientValidationMetadata = []; }
window.mvcClientValidationMetadata.push({"Fields":[],"FormId":"form0","ReplaceValidationSummary":false});
//]]>
</script>

Fields[]空であることに注意してください!

私のビューは強く型付けされており、新しい強く型付けされたHTMLヘルパー(TextBoxFor()など)を使用しています。

モデル/ドメインモデルの表示

public class ItemFormViewModel
{
    public Item Item { get; set; }
    [Required] [StringLength(100)] public string Whatever { get; set; } // for demo
}
[MetadataType(typeof(ItemMetadata))]
public class Item
{
    public string Name { get; set; }
    public string SKU { get; set; }
    public int QuantityRequired { get; set; }
    // etc.
}
public class ItemMetadata
{
    [Required] [StringLength(100)] public string Name { get; set; }
    [Required] [StringLength(50)] public string SKU { get; set; }
    [Range(0, Int32.MaxValue)] public int QuantityRequired { get; set; }
    // etc.
}

(ドメインモデルをビューモデルの一部として/として使用していることはわかっていますが、これは良い習慣ではありませんが、今は無視してください。)

意見

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" 
Inherits="System.Web.Mvc.ViewPage<ItemFormViewModel>" %>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <h2>Editing item: <%= Html.Encode(Model.Item.Name) %></h2>

    <% Html.EnableClientValidation(); %>
    <%= Html.ValidationSummary("Could not save the item.") %>

    <% using (Html.BeginForm()) { %>

        <%= Html.TextBoxFor(model => model.Item.Name) %>
        <%= Html.TextBoxFor(model => model.Item.SKU) %>
        <%= Html.TextBoxFor(model => model.Item.QuantityRequired) %>

        <%= Html.HiddenFor(model => model.Item.ItemID) %>

        <%= Html.TextBox("Whatever", Model.Whatever) %>
    <input type="submit" value="Save" />
    <% } %>
</asp:Content>

WhateverMVCがのサブプロパティを再帰的に検査していないと思われるため、ビューモデルにプロパティを含めましたItemFormViewModel.Itemが、それでも検証されていませんか?MVCフレームワークのソースコードを詳しく調べてみましたが、何も表示されませんでした。何が起こっているのでしょうか?

4

2 に答える 2

9

質問を投稿してから約 5 秒後に、あることに気付きました。私のビューにはValidationMessageどこにもプレースホルダーがありませんでした。<%= Html.ValidationMessageFor(model => model.Item.Name) %>見よ、MVCItem.Nameは、ページの下部にある JS ブロックに検証ルールを追加しました。

実際に次のいずれかを実行しない限り、MVC はフィールドのクライアント側検証規則を発行しないことがわかります。

  1. Html.ValidationMessage()物件に電話。
  2. Html.Validate()物件に電話。(これはエラーメッセージを出力しません)
  3. を使用してコントロールをレンダリングしますHtml.EditorForModel()。(ソース

これらのいずれかを実行すると、MVC に「ビューモデルのこのプロパティはユーザーが編集できるため、検証する必要があります」と伝えられます。新しい厳密に型指定されたヘルパーを使用している場合でも、HTML ヘルパーを使用してページにテキスト ボックスを貼り付けるだけでは十分ではありません。

于 2010-03-17T16:51:39.340 に答える
-1

これをMVC 2 RCで機能させるには運がありませんでした。SO に関する他の質問によると、MVC Futures リリースから MicrosoftMvcJQueryValidation.js ファイルを取得し、左足を頭の後ろに置き、Dixie を 30 分間口笛で吹く必要があります。私はこれ以上のことをしましたが、それを機能させることができませんでした。

RTMで修正されることを願っています。

于 2010-03-17T16:27:04.223 に答える