【问题标题】:Asp.net MVC3 Compare Attribute : Error when comparing against a nested propertyAsp.net MVC3比较属性:与嵌套属性比较时出错
【发布时间】:2011-09-07 17:17:53
【问题描述】:

针对嵌套属性使用 MVC3 比较属性时出错。

示例代码如下:

模型和视图模型:

public class Data
{
    public string Input { get; set; }
}

public class DataVM
{
    public Data Data { get; set; }
    [Compare("Data.Input")]
    public string ConfirmInput { get; set; }
}

控制器:

public ActionResult Data() {
    return View(new DataVM());
}

[HttpPost]
public ActionResult Data(FormCollection fc) {
    DataVM vm = new DataVM();
    TryUpdateModel(vm, fc);
    if (ModelState.IsValid){
        return Content("Success!!!");
    }
    return View(vm);
}

查看:

@model myth.Models.ViewModels.DataVM

@using (Html.BeginForm()) {
@Html.ValidationSummary(true)

@Html.EditorFor(m => m.Data.Input)
@Html.ValidationMessageFor(m => m.Data.Input)
<br />
@Html.EditorFor(m => m.ConfirmInput)
@Html.ValidationMessageFor(m => m.ConfirmInput)
<br />
<input type="submit" value="Save" />
}
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript">    </script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

如果我使用 [Compare("Input")],客户端验证将失败。 如果我使用 [Compare("Data.Input")],客户端验证有效,但服务器端失败。 在类 CompareAttribute.cs 中,方法

protected override ValidationResult IsValid(...) { .. }, 

找不到 Data.Input 属性。

使用 Compare 进行嵌套属性比较的正确方法是什么?

【问题讨论】:

    标签: c# asp.net asp.net-mvc-3 compare nested-properties


    【解决方案1】:

    稍后更改您的视图模型并映射回您的实体:

    public class DataVM
    {
        public string Input { get; set; }
    
        [Compare("Input")]
        public string ConfirmInput { get; set; }
    }
    

    【讨论】:

    • 感谢您的回复。我正在做你在生产中建议的事情,但想知道如何使用比较嵌套属性。背后的原因是在多个视图模型中使用相同的数据模型,并且在数据模型上使用的验证规则需要复制到所有视图模型,这是我们都希望避免的。如果在当前 mvc 版本下不可行,则需要更新 compare 属性的代码以适应未来版本的嵌套属性验证。
    猜你喜欢
    • 2012-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多