【发布时间】:2015-07-29 11:27:04
【问题描述】:
我有一个模型 ModelA 和一个成员 toBeRemoteChecked 和一个模型 MapToA 和一个成员 valueToMap。每当我创建ModelA 的实例时,我还需要MapToA 的实例,所以我有一个模型CreateModelA,其中包括一个成员modelA 和一个成员valueToMap。提交表单后,我将modelA 添加到数据库表ModelA 并创建一个实例并将其添加到MapToA,该实例由modelA 和valueToMap 组成。就代码而言
public class ModelA
{
[Key]
public int ID { get; set; }
[Required, Remote("isValid", "MyController", ErrorMessage = "not valid")]
public string toBeRemoteChecked { get; set; }
}
public class MapToA
{
[Key]
public int Map_ID { get; set; }
[Required]
public int modelAID { get; set; }
[Required]
public int valueToMap { get; set; }
}
public class CreateModelA
{
public ModelA modelA { get; set; };
public int valueToMap { get; set; };
}
当我编辑 ModelA 的实例时,MapToA 中的值无关紧要(在大多数情况下,mapToA 的多个实例具有相同的 modelA id),但远程验证toBeRemoteChecked 仍然很重要。
我的问题:验证方法的绑定:
public ActionResult isValid(string toBeRemoteChecked) { ... }
如果我保持原样,它在编辑ModelA 时可以工作,但在我通过CreateModelA 创建ModelA 时不会(我总是在toBeRemoteChecked 中得到空值)。当我使用 BindPrefix
public ActionResult isValid([Bind(Prefix = "modelA.toBeRemoteChecked")] string toBeRemoteChecked) { ... }
当我创建 ModelA 时它可以工作,但在我编辑它时却不行。
当我尝试通过在 @Html.TextBoxFor 的 htmlAttributes 中添加 ... @Name = "toBeRemoteChecked" ...(而不是由 HTML 帮助程序创建的 modelA.toBeRemoteChecked)来更改 Create.cshtml 中的“名称”时,验证工作正常,但是值与表的绑定丢失了,当值保存到数据库时出现错误(空值)。
那么,如何实现创建和编辑的不同绑定呢?
到目前为止,我的解决方法是制作ModelA 和CreateModelA : IValidatableObject 并在我的public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 方法中检查成员toBeRemoteChecked。但是那个会在表单顶部显示错误消息,而不是在 TextFor 框的位置。
所以:最佳解决方案:如何进行绑定,使远程验证在这两种情况下都有效?
次优:如何在IValidatableObject所属的对象附近显示错误信息(并在手边获取错误信息,而不是提交后)
不同的想法或解决方案:欢迎。
谢谢。
【问题讨论】:
标签: c# asp.net asp.net-mvc validation asp.net-mvc-4