2010-12-05 15 views
53

Tengo Link en la página de afeitado a continuación.Razor actionlink autogenerating? Length = 7 en URL?

@Html.ActionLink("Create New Profile", "Create", "Profile", new { @class="toplink" }) 

veo página de vista de la fuente que está por debajo

<a href="/admin/profile/create?length=7" class="toplink">Create New Profile</a> 

Cuando hago clic en el enlace. La URL es como a continuación.

http://localhost:54876/admin/profile/create?length=7 

Yo no quiero? Length = 7. Por qué esto se genera automáticamente

+0

debe ser algo que ver con sus rutas. Por defecto, ese 'ActionLink' debería generar un href de'/Profile/Create'. Donde 'Profile' es el argumento del controlador, y' Create' es el argumento del método de acción. El hecho de que '/ admin' se ponga en el href resalta este problema. puedes mostrar tus rutas? – RPM1984

Respuesta

85

La anulación ActionLink está utilizando coincidencias con la anulación (string linkText, string actionName, Object routeValues, Object htmlAttributes). Por lo tanto, su valor de "Perfil" se pasa al parámetro routeValues. El comportamiento de esta función con respecto a este parámetro es tomar todas las propiedades públicas en él y agregarlo a la lista de valores de ruta utilizados para generar el enlace. Como una Cadena solo tiene una propiedad pública (Longitud), usted termina con "longitud = 7".

La sobrecarga correcta que desea utilizar es el (string linkText, string actionName, string controllerName, Object routeValues, Object htmlAttributes) y te llaman loke manera:

@Html.ActionLink("Create New Profile", "Create", "Profile", new {}, new { @class="toplink"}) 
+0

Puedes aclararme ... usando esta estructura, mi enlace genera '~/Account/Manage /' ... Tuve que poner el 'nuevo {}' vacío después de mi parámetro, pero ahora se genera como '~/Account/Manage/user = ortund' mientras que quiero '~/Account/Manage/ortund' ... Parece que no puedo llegar y no entiendo por qué – Ortund

+0

Lo gracioso es que la placa base oficial de MVC hace mal uso de esta sobrecarga por defecto cuando se crea un enlace "Olvidé mi contraseña". Tuve que cambiarlo. –

7

No estoy seguro de la causa exacta de esto, pero lo cambio a:

@Html.ActionLink("Create New Profile", "Create", "Profile", new {}, new { @class="toplink" }) 

No sé lo que sobrecargue MVC es recoger cuando salga fuera el último parámetro (htmlattributes es el añadido), pero eso lo arreglará. Uno de estos días voy a investigar y averiguar exactamente qué está pasando.

+0

Este tipo de funcionó para mí, pero aún así terminé con un enlace vago ... Tengo '~/Cuenta/Administrar/usuario = ortund', mientras que lo que necesito es' ~/Cuenta/Administrar/ortund' – Ortund

+0

Puede solo usa null. Al menos eso es lo que siempre uso. –

0

Otra cosa a destacar, ya que está definiendo el controlador en el @ActionLink, que es posible que no tenga que hacer , por ejemplo, la vista en la que se expresa su "Crear nuevo perfil" @ActionLink podría ser "/admin/profile/index.cshtml", una vista que enumera los perfiles existentes, en este caso, no necesita definir el controlador en el @ActionLink como el @ActionLink ya es relativo al ProfileController, por lo que su @ActionLink podría ser

@Html.ActionLink("Create New Profile", "Create", null, new { @class="toplink" }) 

que utilizan null en lugar de new{} como la respuesta marcada hace, creo que esto es más apropiado a mí mismo. Las sobrecargas de ActionLink no son lo más sencillo que haya existido.