刪除必需的屬性,並添加自定義的驗證。
或者只是創建兩個單獨的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>
}
如何映射用戶模式?對不起,我無法得到。 – Sami
你的行動將有視圖模型作爲參數,例如FirstNameViewModel,你有這樣的視圖模型的複製價值,以用戶名,財產以後這樣user.FirstName = viewModel.Value。經常爲這個目的而使用AutoMapper http://automapper.codeplex.com/ –
我不知道映射的想法所以需要一定的時間來學習,我需要迫切解決:( – Sami