我有一个基本模型,我试图使用远程属性进行一些远程验证。
[Remote("IsCodeValid", "Utilities", ErrorMessage = "Code already in use")]
[Required]
public string Code { get; set; }
如果我执行正常的Html.Editorfor(m => m.Code),那么一切正常,我能够成功使用远程验证。因此,正常用例中的属性和控制器方法运行良好。
问题
我尝试使用EditorTemplate,其中我使用第三方库重新创建输入控件。在EditorTemplate中,我需要访问远程验证属性,例如所有" data-val"属性,然后添加它们或如果有一些方法可用,我可以得到它们的列表,然后只需一次添加它们。
我已设法访问编辑器模板中的Html.ViewData。
有人能指出我正确的方向吗?有人做过这样的事吗?
这是我的编辑器模板的流程,因此它可以让您了解我想要实现的目标。
// Start of editor template
@model String
@{
var htmlAttributes = new Dictionary<string, object>();
// Observe how I can manually add attributes to the dictionary
htmlAttributes.Add("data-val", "true");
// Able to add Css class from ViewModel
if (Html.ViewData.ContainsKey("class"))
{
var cssClass = Html.ViewData.SingleOrDefault(kvp => kvp.Key.ToLower() == "class");
htmlAttributes.Add(cssClass.Key, cssClass.Value);
}
}
@(
// At this point is where I need to pass the htmlAttributes with the [Remote] validation values so that it can be added to the input control
Html.Custom3rdPartyLibrary()
.TextEditorFor(x => Model)
.HtmlAttributes(htmlAttributes)
.Render()
)
答案 0 :(得分:1)
您可以使用GetUnobtrusiveValidationAttributes()
的{{1}}方法根据HtmlHelper
获取验证属性。
ModelMetadata
根据应用于您的属性的验证属性,@model string
@{
// Get the ModelMetadata
ModelMetadata metadata = ViewContext.ViewData.ModelMetadata;
// Get the validation attributes
IDictionary<string, object> attributes = @Html.GetUnobtrusiveValidationAttributes(metadata.PropertyName, metadata );
}
将包含以下键/值对
attributes
然后您可以将任何其他属性(如类名)添加到字典中,并使用data-val-required: "The Code field is required."
data-val-remote: "Code already in use"
data-val-remote-url: "/Utilities/IsCodeValid"
data-val-remote-additionalfields: "*.Code"
data-val: true