如果我的值链接到实例的变量,我应该如何将值传递到控制器中的验证操作

本文关键字:值传 操作 控制器 验证 我应该 链接 我的 实例 变量 如果 | 更新日期: 2023-09-27 18:21:44

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

概述

我正在使用MVC 4和jQuery验证。我的表格正在客户端进行验证。我有一个场景,在我的窗体上需要两个非常相似的对象。这是通过具有两个属性的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);
    }
}

视图控制器链接到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.VariableName,例如BrightColour.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" />
}

如果我的值链接到实例的变量,我应该如何将值传递到控制器中的验证操作

通常,在这种情况下,您会在远程验证操作中使用前缀,如下所示:

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

但是,在您的情况下不能这样做,因为您在ViewModel(而不是ModelView)中使用两个相同的实体,并且每个实体都有自己的前缀。因此,绑定失败。

因此,您必须创建两个独立的ViewModels:

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