2014-01-13 41 views
0

我有一個視圖,且具有在該視圖中的兩個按鈕,我有一個模型。一個是「更新」按鈕,另一個是「更改」按鈕。驗證具有兩個按鈕和一個類

我希望如果點擊更新按鈕,那麼只有名字應該驗證, ,如果點擊更改按鈕,然後姓氏只應驗證,但在按鈕單擊它驗證兩個字段。

這是我的看法:

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

回答

1

刪除必需的屬性,並添加自定義的驗證。

或者只是創建兩個單獨的ViewModels。

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

,然後在用戶模型映射視圖模型。

更新自定義驗證屬性

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> 
} 
+0

如何映射用戶模式?對不起,我無法得到。 – Sami

+0

你的行動將有視圖模型作爲參數,例如FirstNameViewModel,你有這樣的視圖模型的複製價值,以用戶名,財產以後這樣user.FirstName = viewModel.Value。經常爲這個目的而使用AutoMapper http://automapper.codeplex.com/ –

+0

我不知道映射的想法所以需要一定的時間來學習,我需要迫切解決:( – Sami

相關問題