konto usunięte
Temat: MVC3 KeyAttribute ignorowany przez EditorForModel
Zarys problemu: jeżeli poprzez atrybuty oznaczam sobie model i użyję KeyAttribute z DataAnnotations to IMHO EditorForModel/DisplayForModel powinien to zrozumieć i tym samym:- nie wyświetlać i nie przesyłać przy create (bo repository/DB sam to wygeneruje)
- przy edit zrobić hidden (opcjonalnie wyświetlić) i nie walidować po stronie klienta
Dodam, że pole nie nazywa się Id (wtedy przeszło by z RouteDictionary z innego ValueProvidera)
Kombinując z całą menażerią atrybutów HiddenInput, ScaffoldColumn, ReadOnly nic nie osiągnąłem i na tym etapie mam pytanie, jak osiągnąć efekt w prosty sposób - może coś przegapiłem?
Natomiast udało mi się takiego hacka popełnić, ale moim zdaniem za dużo kombinowania, aby osiągnąć podstawową funkcjonalność:
1. napisałem własny ModelMetadataProvider - komentarze w kodzie
2. dodałem własny editor template aby pozbyć się tych validatorów
Ad1
public sealed class MyModelMetadataProvider : DataAnnotationsModelMetadataProvider {
protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName) {
var metadata = base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName);
//jeżeli występuje atrybut Key z DataAnnotations
if (!metadata.IsComplexType && attributes.OfType<KeyAttribute>().Any()) {
//pusty model oznacza u mnie create
if (null == metadata.Model) {//create
//to przy create w ogóle nie wyświetlam
metadata.ShowForEdit = false;
} else {//edit
//w przypadku edit muszę się odwołać do własnego template
metadata.TemplateHint = "primaryKey";//którego tak właśnie nazwałem
//i pominąć html
metadata.HideSurroundingHtml = true;
}
}
return metadata;
}
}
Ad2 Views/Shared/EditorTemplates/primaryKey.cshtml
@{maciek kański edytował(a) ten post dnia 08.09.11 o godzinie 18:01
string _name = this.ViewData.TemplateInfo.GetFullHtmlFieldName("");
string _id = this.ViewData.TemplateInfo.GetFullHtmlFieldId("");
}
<input type="hidden" id="@_id" name="@_name" value="@Html.AttributeEncode(this.Model)" />