【问题标题】:How to validate IEnumerable<string> property in Model in MVC 4如何在 MVC 4 的模型中验证 IEnumerable<string> 属性
【发布时间】:2014-06-23 02:29:00
【问题描述】:

我有模型,它具有 IEnumerable 属性。

public class SendEmailModel
{
    [Required]
    [RegularExpression(Helper.DefaultEmailValidationPattern, ErrorMessageResourceName = "InvalidValue", ErrorMessageResourceType = typeof(i18n))]
    public IEnumerable<string> Recipients { get; set; }

    [RegularExpression(Helper.DefaultInputValidationPattern, ErrorMessageResourceName = "InvalidValue", ErrorMessageResourceType = typeof(i18n))]
    public string Subject { get; set; }
    ...
}

在视图中

@using (Ajax.BeginForm("SendEmail", "Admin", new AjaxOptions { LoadingElementId = "loadingPane" }, new { id = "SendEmailForm"}))
{
    <div class="custom-validation-summary-errors"></div>

    <div>
        @Html.LabelFor(m => m.Recipients, i18n.To):
    </div>

    for (int i = 0; i < 10; i++)
    {
        <div>
            @Html.EditorFor(m => m.Recipients, "String")
        </div>
    }

    <div class="mt20">
        @Html.LabelFor(m => m.Subject, i18n.Subject):
    </div>
    <div>
        @Html.EditorFor(m => m.Subject, "String")
    </div>

   ...

   <input type="submit" value="Send"/>
}

但是在发布表单验证时不起作用。发布后我得到 ModelState.IsValid - false。

编辑: 我正在尝试使用不显眼的验证。主题验证有效(用户无法发布主题无效的表单)

for 循环将被 jquery 添加/删除收件人替换。

【问题讨论】:

  • 你能发布完整的视图和操作吗?

标签: c# asp.net-mvc asp.net-mvc-4


【解决方案1】:

您不能在IEnumerable&lt;T&gt; 类型属性上使用验证数据注释。您可以创建一个包装类,如下所示:

public class Recipient
{
    [RegularExpression(Helper.DefaultEmailValidationPattern, ErrorMessageResourceName = "InvalidValue", ErrorMessageResourceType = typeof(i18n))]
    public string EmailAddress { get; set; }
}

然后在你的主 ViewModel 中,

public class SendEmailModel
{
    [Required]
    public IEnumerable<Recipient> Recipients { get; set; }

    ...
}

现在您可以通过创建绑定到Recipient 的局部视图来为您的Recipient 类创建editor template,如下所示:

@Html.TextBoxFor(model => model.EmailAddress)

现在,在绑定到SendEmailModel 的主视图中,您可以这样做:

@Html.EditorForModel

这将为每个属性创建一个编辑器。在这种情况下,该属性的类型为IEnumerable&lt;Recipient&gt;,因此它将为该列表中的每个项目创建一个编辑器模板(如前所述)。将自动应用所有验证。

Here 是类似的讨论。

【讨论】:

    【解决方案2】:

    只是一个想法,但如何创建绕过属性?

    可能会做类似的事情

    string RecipienctsCsv {
     get
     {
       return string.Join(', ', Recipiencts);
     }
    }
    

    再一次,您没有显示足够的代码来验证这是否适合您。另一种选择是扩展 HtmlHelper 以使其适用于 IEnumerable

    【讨论】:

      猜你喜欢
      • 2018-02-01
      • 2012-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多