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
@{
string _name = this.ViewData.TemplateInfo.GetFullHtmlFieldName("");
string _id = this.ViewData.TemplateInfo.GetFullHtmlFieldId("");
}
<input type="hidden" id="@_id" name="@_name" value="@Html.AttributeEncode(this.Model)" />
maciek kański edytował(a) ten post dnia 08.09.11 o godzinie 18:01
Daniel Dąbrowski

Daniel Dąbrowski Właściciel, 42n

Temat: MVC3 KeyAttribute ignorowany przez EditorForModel


[Bind(Exclude = "Id")]
public abstract class DomainModel<TId>
{
/// <summary>
/// Identyfikator modelu.
/// </summary>
[HiddenInput(DisplayValue = false)]
public virtual TId Id { get; set; }


:) .. na drugi raz dzwon na tel :)



Wyślij zaproszenie do