2010-11-17 9 views
0

J'ai une page de détails contenant un champ de formulaire nommé UserId. Sur la même page, j'ai un autre formulaire de recherche avec un champ également nommé UserId. J'utilise Html.LabelFor (vm> vm.UserId) et Html.TextBoxFor (sm> sm.UserId) sur les deux modèles de vue différents, vm étant le modèle de vue et sm étant le modèle de recherche. (Oui, la propriété UserId sur les deux modèles a des noms identiques - parce qu'ils sont la même propriété de domaineParamètres d'action ASP.NET MVC avec préfixe lié non compatible avec Url.Route dans Global.asax

Lorsque j'accède à la page, l'UserId rempli sur le vm est inséré dans les deux champs de formulaire nommés UserId par MVC. même les sm.UserId sont vides.

C'est mon problème initial. Il y a quelques façons ti éviter cela. ma solution était d'utiliser le drapeau du préfixe pour le sm.

[HttpGet] 
    public ActionResult Search([Bind(Prefix = "Search")] SearchFormViewModel searchFormViewModel, PagingViewModel pagingViewModel) 
    { 

Cela provoque MVC pour rendre un Search.UserId sur le nom de champ dans le formulaire de recherche, mais la propriété dans le code sera toujours nommée UserId

Cette solution semble fonctionner très bien!

MAIS: Maintenant, je dois adresser le search.UserId sur un itinéraire de Global.asax. I Carte de la route comme ceci:

routes.MapRoute(
      "MyRouteName", 
      "ControllerName/User/{Search.UserId}", 
      new { controller = "ControllerName", action = "Search" } 
      ); 

Mon problème est que MVC ne peut pas mapper le Search.UserId pour adapter la UserId (préfixés par Recherche) dans l'action ci-dessus (à cause du.).

Il semble donc que MVC a une préfixe, qui est en fait entièrement supportée par le gestionnaire de routage. Bien sûr, je pourrais renommer le Search.UserId à Search_UserId, mais le nom dosent correspond au nom attendu par MVC dans l'action de réception ci-dessus. (s'attend à Search.UserId) Renommer La propriété UserId du modèle de recherche permettrait de résoudre le problème, mais comme il s'agit de la même valeur dans le domaine, cela semble être une solution de contournement. Est-ce qu'il me manque quelque chose à propos de l'utilisation de la fonctionnalité Préfixe ou est-ce que ce n'est pas possible?

Répondre

0

Alors ... J'y ai réfléchi depuis un moment maintenant. - Et un de mes collègues m'a soudainement montré la lumière.

Le problème se situe où MVC mappe l'objet à un dictionnaire de routes.

<a href="<%: Url.RouteUrl("MyRouteName", new { Search.UserId = Model.UserId }) %>" target="_blank">See the user</a> 

travail. Parce que MVC ne peut pas gérer le. (Point) dans le nom de l'objet.

  • mais étant donné que le nom d'objet est simplement une clé de chaîne dans la RouteValueDictionary, la plaquant moi-même fait l'affaire:

    <a href="<%: Url.RouteUrl("MyRouteName", new RouteValueDictionary(new Dictionary<string, object>(){ "Search.UserId", Model.UserId })) %>" target="_blank">See the user</a>

+0

La dernière ligne de code a été jinx'ed parce que il pensait que c'était un lien. même si j'ai utilisé des balises de code. Mais le voici: (){ "Search.UserId", Model.UserId })) %>" target="_blank">See the user esbenr