【发布时间】:2010-03-25 21:32:15
【问题描述】:
我有一个 ViewModel 用于添加具有以下属性的用户:电子邮件、密码、ConfirmPassword 以及所有属性的必需属性。编辑用户时,我希望不需要 Password 和 ConfirmPassword 属性。
有没有办法在不同的控制器操作中禁用某些属性的验证,还是最好创建一个单独的 EditViewModel?
【问题讨论】:
我有一个 ViewModel 用于添加具有以下属性的用户:电子邮件、密码、ConfirmPassword 以及所有属性的必需属性。编辑用户时,我希望不需要 Password 和 ConfirmPassword 属性。
有没有办法在不同的控制器操作中禁用某些属性的验证,还是最好创建一个单独的 EditViewModel?
【问题讨论】:
我喜欢将其分解,并为每个视图创建一个包含所有公共数据和继承的基础模型:
class UserBaseModel
{
int ID { get; set; }
[Required]
string Name { get; set; }
[Required]
string Email { get; set; }
// etc...
}
class UserNewModel : UserBaseModel
{
[Required]
string Password { get; set; }
[Required]
string ConfirmPassword { get; set; }
}
class UserEditModel : UserBaseModel
{
string Password { get; set; }
string ConfirmPassword { get; set; }
}
有兴趣知道是否还有更好的方法,尽管这种方法看起来非常干净灵活。
【讨论】:
您可以编写一个自定义属性来测试条件并允许或不允许空字段。
下面是我为这里的人准备的一个简单的演示。您需要进行修改以适合您的目的/
using System.ComponentModel.DataAnnotations;
namespace CustomAttributes
{
[System.AttributeUsage(System.AttributeTargets.Property)]
public class MinimumLength : ValidationAttribute
{
public int Length { get; set; }
public MinimumLength()
{
}
public override bool IsValid(object obj)
{
string value = (string)obj;
if (string.IsNullOrEmpty(value)) return false;
if (value.Length < this.Length)
return false;
else
return true;
}
}
}
型号;
using CustomAttributes;
namespace Models
{
public class Application
{
[MinimumLength(Length=20)]
public string name { get; set; }
}
}
控制器
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(Application b)
{
ViewData["Message"] = "Welcome to ASP.NET MVC!";
if (ModelState.IsValid)
{
return RedirectToAction("MyOtherAction");
}
return View(b);
}
enter code here
【讨论】: