我在 ASP.NET MVC 中遇到自定义验证问题。我想为下面的 ServerName 属性实现条件所需的验证。条件是如果 ServerSpecific 属性为 true,则 ServerName 应该是必填字段。我已经使用 Validate 方法来做到这一点,但由于某种原因,特定代码 Vlaidate 方法在任何情况下都不会命中。这里有什么遗漏吗?
public class PlatformConfigurationEditModel : IValidatableObject
{
#region Constructor
public PlatformConfigurationEditModel()
{
SettingEnabled = true;
}
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (ServerSpecific == true && String.IsNullOrEmpty(ServerName))
{
yield return new ValidationResult("Please provide Server Name!.");
}
}
[ScaffoldColumn(false)]
public int Id { get; set; }
[Required]
[ScaffoldColumn(false)]
public int PlatformProfileId { get; set; }
[Required]
[ScaffoldColumn(false)]
public int EnvironmentId { get; set; }
[Required]
[DisplayName("Setting Name")]
[JqGridColumnEditable(true, EditType = JqGridColumnEditTypes.Text)]
public string SettingName { get; set; }
[Required]
[JqGridColumnEditable(true, EditType = JqGridColumnEditTypes.Text)]
[DisplayName("Setting Value")]
public string SettingValue { get; set; }
[Required]
[DisplayName("Setting Enabled")]
[JqGridColumnSearchable(false)]
[JqGridColumnEditable(true, EditType = JqGridColumnEditTypes.CheckBox)]
public bool SettingEnabled { get; set; }
[DisplayName("Server Specific")]
[JqGridColumnSearchable(false)]
[JqGridColumnEditable(true, EditType = JqGridColumnEditTypes.CheckBox)]
public Nullable<bool> ServerSpecific { get; set; }
[DisplayName("Server Name")]
[JqGridColumnEditable(true, "GetServers", "Profile", EditType =
JqGridColumnEditTypes.Select)]
public string ServerName { get; set; }
[ScaffoldColumn(false)]
public Nullable<int> ServerId { get; set; }
[ScaffoldColumn(false)]
public int ProfileVersionId { get; set; }
}
}
控制器动作方法
[HttpPost]
public ActionResult Add(
[ModelBinder(typeof(PlatformConfigurationEditModelBinder))]
PlatformConfigurationEditModel platformconfiguration)
{
if (ModelState.IsValid)
{
#region web binding value adjustments
if (platformconfiguration.SettingName.ToLower() == "webbinding")
{
platformconfiguration.SettingValue = ModifyWebBinding
(platformconfiguration.SettingValue);
}
#endregion
var updatedEntity = From<PlatformConfigurationEditModel>.To<PlatformConfiguration>
(platformconfiguration);
////
//// update server id
////
if (updatedEntity.ServerSpecific.HasValue && updatedEntity.ServerSpecific.Value)
{
updatedEntity.ServerId = Convert.ToInt32(platformconfiguration.ServerName);
}
_context.PlatformConfigurations.Add(updatedEntity);
_context.SaveChanges();
}
return RedirectToAction("Add");
}
模型粘合剂-
public class PlatformConfigurationEditModelBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext,
ModelBindingContext bindingContext)
{
var request = controllerContext.HttpContext.Request;
int environmentId;
int profileId;
int id = 0;
int pfvid;
string paramdata = request.Params["Id"];
if (!paramdata.Equals("_empty"))
{
int[] data = request.Params["id"].Split('-').Select(n => Convert.ToInt32(n)).ToArray
();
id = data[0];
profileId = data[1];
environmentId = data[2];
pfvid = data[3];
}
else
{
id = 0;
int[] extdt = request.Params["ExtData"].Split('-').Select(n => Convert.ToInt32
(n)).ToArray();
profileId = extdt[0];
environmentId = extdt[1];
pfvid = extdt[2];
}
string settingEnabled = request.Params["SettingEnabled"];
string serverSpecific = request.Params["ServerSpecific"];
string settingName = request.Params["SettingName"];
string settingValue = request.Params["SettingValue"];
string serverName = request.Params["ServerName"];
return new PlatformConfigurationEditModel
{
Id = id,
EnvironmentId = environmentId,
PlatformProfileId = profileId,
ServerSpecific = serverSpecific.ToLower() == "on" || serverSpecific.ToLower()
== "true",
SettingEnabled = settingEnabled.ToLower() == "on" || settingEnabled.ToLower()
== "true",
ServerName = serverName,
SettingName = settingName,
SettingValue = settingValue,
ProfileVersionId = pfvid
};
}
}