2

MVC と jQuery の検証を使い始めたばかりなので、ご容赦ください。また、質問のタイトルがどうあるべきかわかりません。8(

概要

jQuery ValidateでMVC 4を使用しています。私のフォームはクライアント側で検証されています。2 つの非常によく似たオブジェクトをフォームに配置する必要があるシナリオがあります。これは、2 つのプロパティを持つ ModelView によって実現されています。ModelView は View にリンクされており、リモート検証を除いてすべてが機能します。オブジェクトの特定の値に基づいてフィールドを検証する必要があります。コントローラーの検証アクションのパラメーターを除いて、すべてがうまくリンクされています。あなたが私にチチッと 不承認を与える前に、私は次のコード シナリオを作成しました。

コード

Nameの値に応じてリモート検証が必要なモデルクラスGroupID。基本的に、名前はグループに固有です。

public class Colour
{
    [Key]
    public int GroupID {get;set;}

    [Required]
    [Remote("ColourExists", "Validation", AdditionalFields = "GroupID")]
    public string Name {get;set;}
}

ColourExistsアクションが存在する検証コントローラー。

public class ValidationController :Controller {
    public JsonResult ColourExists(string name, string groupID) {
        // Add validation here later
        return Json(false, JsonRequestBehavior.AllowGet);
    }
}

ViewControllerModelViewにリンクされているため、フォームに 2 つの個別のインスタンスを表示できます。通常、ユーザーに 1 つのグループの明るい色と暗い色を尋ねる必要があります。(ちなみに、これは本物ではないことを覚えておいてください)

 public class ColourViewModel {
     public Models.Colour BrightColour { get; set; }
     public Models.Colour DarkColour {get;set;}
 }

生成された HTMLには、入力フィールドBrightColour_NameDarkColour_Name. これらのフィールドにはdata-val-remote-additionalfields=*.Name属性があります。ブラーではGET、正しいアクションとコントローラーですが、パラメーターは null です。期待されるパラメータはやInstanceName.VariableNameなどです。リクエストは次のように送信されますBrightColour.NameDarkColour.NameValidation/ColourExists?BrightColour.Name=red&BrightColour.GroupID=10

ColourExistsでは、値がインスタンスの変数にリンクされている場合、検証コントローラーのアクションに値を渡すにはどうすればよいでしょうか?

編集

ビューは次のようになります。

@model Colours.ViewModels.ColourViewModel
@using (Html.BeginForm()) {
    @Html.LabelFor(model => model.DarkColour.Name)
    @Html.EditorFor(model => model.DarkColour.Name)
    @Html.HiddenFor(model => model.DarkColour.GroupID)
    <input type="submit" value="Save" />
}
4

1 に答える 1

1

通常、この状況では、次のようにリモート検証アクションでプレフィックスを使用します。

public JsonResult ColourExists([Bind(Prefix = "BrightColour")] string name) {
    // Add validation here later
    return Json(false, JsonRequestBehavior.AllowGet);
}

ただし、ViewModel (ModelView ではない) で 2 つの同じエンティティを使用しており、それぞれに独自のプレフィックスがあるため、あなたのケースではそれを行うことはできません。したがって、バインディングは失敗します。

したがって、2 つの個別の ViewModel を作成する必要があります。

public class BrightColourViewModel
{
    public int GroupID { get; set; }
    [Required]
    [Remote("BrightColourExists", "Home", AdditionalFields = "GroupID")]
    public string Name { get; set; }
}

public class DarkColourViewModel 
{
    public int GroupID { get; set; }
    [Required]
    [Remote("DarkColourExists", "Home", AdditionalFields = "GroupID")]
    public string Name { get; set; }
}

次に、次のように ColourViewModel を再定義します。

public class ColourViewModel
{
    public BrightColourViewModel BrightColour { get; set; }
    public DarkColourViewModel DarkColour { get; set; }
}

次に、次のように 2 つの個別のリモート検証アクションを作成します。

public JsonResult BrightColourExists(BrightColourViewModel brightColour)
{
    // Call shared code to check if colour exists
    return Json(false, JsonRequestBehavior.AllowGet);
}

public JsonResult DarkColourExists(DarkColourViewModel darkColour)
{
    // Call shared code to check if colour exists
    return Json(false, JsonRequestBehavior.AllowGet);
}
于 2013-07-09T19:27:12.193 に答える