2

我才刚刚开始使用 MVC 和 jQuery 验证,所以请多多包涵。我也不知道我的问题应该是什么标题。8(

概述

我正在使用带有 jQ​​uery 验证的 MVC 4。我的表单正在客户端进行验证。我有一个场景,我的表单上需要两个非常相似的对象。这是通过具有两个属性的 ModelView 实现的。ModelView 链接到 View 并且除了远程验证之外一切正常。我需要根据对象中的特定值验证字段。除了控制器中验证操作的参数之外,所有内容都很好地链接在一起。在你给我不赞成tsk tsks 之前, 我编造了以下代码场景。

编码

模型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);
    }
}

ViewController链接到ModelView以便我可以在表单上显示两个单独的实例。通常,我需要向用户询问一组的亮色和暗色。(在你tsk之前,请记住,这不是真的

 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是正确的动作和控制器,但参数为空。预期的参数InstanceName.VariableNameBrightColour.NameDarkColour.Name。请求发送如下Validation/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)中使用了两个相同的实体,并且每个实体都有自己的前缀。所以,绑定失败。

因此,您必须创建两个单独的 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; }
}

然后,像这样创建两个单独的远程验证操作:

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 回答