7
votes

ASP.NET MVC 3 ID de modèle à l'aide de la valeur ID de route

scénario fort>
Route: / Modèle / Personnaliser / 10 Où: 10 = ID de modèle ()

Dans le contrôleur, le modèle est créé sur la base du modèle de sorte que le modèle de la vue est en réalité un objet personnalisation () qui a réellement un identifiant de 0 parce qu'il est nouveau. P>

dans la vue I Render @ html.Hiddenfor (m => m.Id) et la valeur résultante de cette entrée cachée est 10 forte>, bien qu'elle soit 0 forte> parce que m est de personnalisation de type. Je suis entré dans cela avant avec MVC 2 et j'ai travaillé autour de lui en n'utilisant pas les méthodes d'assistance. P>

questions forte> p>

  1. y a-t-il une annotation ou quelque chose que je peut ajouter à la méthode HTML Helper à effectivement rendre la valeur correcte? p> li>

  2. est-ce un bogue (MVC semble être Rendu M.ID comme valeur de route Indépendamment de ce que le modèle réel est défini sur dans le contrôleur)? p> li> ol>

    code supplémentaire pour clarification strong> p>

    strong> p> xxx pré>

    Contrôleur strud> p> xxx pré>

    solution strong> p>

    modification de la signature d'action à: p>

    /template/customize?TemplateId=10
    


2 commentaires

Pourriez-vous s'il vous plaît montrer du code? Contrôleur et vue seraient utiles. On dirait que votre point de vue peut être hérité du mauvais type de modèle.


Ajouté du code. La vue utilise le bon type pour le modèle. Comme Charlino identifie, ce n'est probablement pas un bogue, mais une conséquence. Le problème est que cette conséquence enfreint l'automatisation.


3 Réponses :


3
votes

Je pense que c'est parce que lorsque vous utilisez quelque chose comme @ html.hiddacfor (m => m.Id) Les aides HTML examinent dans divers endroits pour remplir la valeur de l'entrée et les valeurs dans le route est l'un de ces endroits.

Vous pouvez donc changer votre itinéraire afin que ce soit quelque chose comme modèle / personnalisation / {templateid} et ensuite votre méthode d'action reflète ceci, par exemple. ActionSResulte publique Personnaliser (int templateid) .

ou vous pouvez modifier votre viewModel (ou créer un modèle de vue personnalisé) qui possède une propriété personnalisation propriété plutôt que simplement ID . .

Et non, ce n'est pas un bug ... C'est plus une fonctionnalité qui peut avoir des conséquences imprévues. Mais une fois que vous êtes au courant, cela fonctionne comme un régal.


6 commentaires

Je me rends compte que je me penche probablement les règles et en casser quelques-uns aussi bien. Sentant définitivement la douleur de cela, mais je me sens toujours comme M.ID devrait toujours être le modèle.Id Pas la route.Id à moins que le modèle n'existe pas dans le contexte.


Vous me conduisez à une solution acceptable, donc je marquais votre réponse. Suivi avec une édition contenant ce que j'ai fait.


Je veux juste clarifier, que l'une de vos autres solutions aurait également travaillé (et que la route aurait été plus élégante). Je ne voulais tout simplement pas créer un nouvel itinéraire dans ma table de route.


Pourquoi pourquoi pourquoi a-t-il une valeur d'un itinéraire plutôt que d'un élément sur une forme? Sachez-vous où je peux en savoir plus à ce sujet? Merci


J'achète cela comme une fonctionnalité si vous utilisez un modèle dactylographié dactylographié, mais ce n'est pas le cas. Vous ne pourrez même pas ajouter de masqué à un autre paramètre d'itinéraire car le cachissement s'attendra à une expression qui retourne une mémorisation de la membéré pointant vers une propriété du type de modèle. Par exemple, vous ne pourrez pas faire HTML.HÉDITDOR (x => x.controller)


J'ai l'impression que ceci est un bug. Si j'utilise une vue fortement typée, je m'attendrais à ce que Model => Model.ID soit exactement un endroit pour l'ID qui étant le modèle de vue.



8
votes

Vous pouvez toujours choisir de ne pas utiliser l'aide HTML dans ce cas et utilisez plutôt HTML HTML:


0 commentaires

0
votes

Pour empêcher les valeurs de route de remplacer les propriétés correspondantes du modèle, appelez modelstate.clear () code> dans votre action de contrôleur. Soyez prudent d'appeler cette méthode après em> en utilisant / lisant l'état modèle.

public ActionResult Customize( int id )
{
    var template = Persistence.Data.RetrieveObject<Template>( id );
    var model = new Customization();

    ViewBag.Template = template;

    this.ViewData.ModelState.Clear(); // add that after you consume the ModelState
    return ( View( model ) );
}


0 commentaires