【问题标题】:Validation of form with two buttons and one class使用两个按钮和一个类验证表单
【发布时间】:2014-01-13 19:43:48
【问题描述】:

我有一个视图,该视图中有两个按钮,我有一个模型。一个是“更新”按钮,另一个是“更改”按钮。

我希望如果单击更新按钮,则只应验证名字, 如果单击更改按钮,则应仅验证姓氏,但单击按钮时将验证两个字段。

这是我的看法:

@model MyProject.Web.Models.User
@using (Html.BeginForm("Update", "ControllerName"))
         {
            @Html.ValidationSummary()
            @Html.LabelFor(u => u.FirstName)
            @Html.TextBoxFor(u => u.FirstName)

            <button type="submit" id="btnUpdate">Update</button>
}

@using (Html.BeginForm("Change", "ControllerName"))
         {
            @Html.ValidationSummary()
            @Html.LabelFor(u => u.LastName)
            @Html.TextBoxFor(u => u.LastName)

           <button type="submit" id="btnChange">Change</button>
        }

类实现是:

 public class User
 {
    [Required]
    [StringLength(32, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 2)]
    [Display(Name = "First Name")]
    public string FirstName { get; set; }

    [Required]
    [Display(Name = "Last Name")]
    [StringLength(32, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 2)]
    public string LastName { get; set; }
 }

【问题讨论】:

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


    【解决方案1】:

    删除必需属性并添加自定义验证。

    或者只是创建两个单独的 ViewModel。

    public class FirstNameViewModel 
     {
        [Required]
        [StringLength(32, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 2)]
        [Display(Name = "First Name")]
        public string Value { get; set; }
    }
    
     public class LastNameViewModel 
     {
        [Required]
        [Display(Name = "Last Name")]
        [StringLength(32, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 2)]
        public string Value { get; set; }
     }
    

    通用视图模型

    public class ViewModel
        {
            public FirstNameViewModel FirstNameViewModel { get; set; }
    
            public LastNameViewModel LastNameViewModelNameViewModel { get; set; }
        }
    

    查看

    @model ViewModelDynamicAttribute.ViewModels.ComplexViewModel
    
    @using (Html.BeginForm("Update", "Home"))
    {
        @Html.ValidationSummary()
        @Html.LabelFor(u => u.FirstNameViewModel.Value)
        @Html.TextBoxFor(u => u.FirstNameViewModel.Value)
    
        <button type="submit" id="btnUpdate">Update</button>
    }
    
    @using (Html.BeginForm("Change", "Home"))
    {
        @Html.ValidationSummary()
        @Html.LabelFor(u => u.LastNameViewModelNameViewModel.Value)
        @Html.TextBoxFor(u => u.LastNameViewModelNameViewModel.Value)
    
        <button type="submit" id="btnChange">Change</button>
    }
    

    动作

    public ActionResult Update(ComplexViewModel viewModel)
            {
                return null;
            }
    
            public ActionResult Change(ComplexViewModel viewModel)
            {
                return null;
            }
    

    然后将 viewModel 映射到用户模型上。

    更新自定义验证属性

    public enum ActionMethodEnum
        {
            Change,
            Update
        }
    
        public class ConditionalRequiredAttribute : RequiredAttribute
        {
            public ActionMethodEnum ActionMethodEnum { get; set; }
    
            public string ActionMethodFieldName { get; set; }
    
            protected override ValidationResult IsValid(object value, ValidationContext validationContext)
            {
                var property = validationContext.ObjectType.GetProperty(ActionMethodFieldName);
                if (property == null)
                {
                    return new ValidationResult(string.Format("{0} is unknown property", ActionMethodFieldName));
                }
                if (property.PropertyType != typeof(ActionMethodEnum))
                {
                    return new ValidationResult(string.Format("{0} property has invalid type", ActionMethodFieldName));
                }
    
                ActionMethodEnum actionMethodEnum;
                Enum.TryParse(property.GetValue(validationContext.ObjectInstance, null).ToString(), out actionMethodEnum);
                if (actionMethodEnum != ActionMethodEnum)
                {
                    return ValidationResult.Success;
                }
    
                return base.IsValid(value, validationContext);
            }
        }
    

    你的模型

    public class User
        {
            public ActionMethodEnum ActionMethod { get; set; }
    
            [ConditionalRequired(ActionMethodEnum = ActionMethodEnum.Update, ActionMethodFieldName = "ActionMethod")]
            [StringLength(32, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 2)]
            [Display(Name = "First Name")]
            public string FirstName { get; set; }
    
            [ConditionalRequired(ActionMethodEnum = ActionMethodEnum.Change, ActionMethodFieldName = "ActionMethod")]
            [Display(Name = "Last Name")]
            [StringLength(32, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 2)]
            public string LastName { get; set; }
        }
    

    观点的变化

    @using (Html.BeginForm("Update", "ControllerName"))
    {
        @Html.ValidationSummary()
        @Html.LabelFor(u => u.FirstName)
        @Html.TextBoxFor(u => u.FirstName)
        {
            Model.ActionMethod = ActionMethodEnum.Update;
        }
        @Html.HiddenFor(u => u.ActionMethod)
    
        <button type="submit" id="btnUpdate">Update</button>
    }
    
    @using (Html.BeginForm("Change", "ControllerName"))
    {
        @Html.ValidationSummary()
        @Html.LabelFor(u => u.LastName)
        @Html.TextBoxFor(u => u.LastName)
        {
            Model.ActionMethod = ActionMethodEnum.Change;
        }
        @Html.HiddenFor(u => u.ActionMethod)
    
        <button type="submit" id="btnChange">Change</button>
    }
    

    【讨论】:

    • 如何映射到用户模型上?对不起,我不能得到。
    • 您的操作将以 ViewModel 作为参数,例如 FirstNameViewModel,您必须将此 viewModel 的值复制到用户名,类似于 user.FirstName = viewModel.Value。经常为此目的使用 AutoMapper automapper.codeplex.com
    • 我对映射器一无所知,所以需要时间研究我需要紧急解决方案:(
    • 我可以在一个视图中使用两个模型吗?
    • 否,但您可以创建复杂模型,其中包含 FirstNameViewModel 和 LastNameViewModel。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-18
    相关资源
    最近更新 更多