2010-08-11 9 views
9
<% using (Html.BeginForm("SubmitUserName")) { %> 
    <input type='text' name='user-name' /> 
    <input type='submit' value='Send' /> 
<% } %> 

¿Cuál debe ser la firma de un método de acción correspondiente para aceptar el parámetro user-name?Uso de un guion (-) en los parámetros de ASP.MVC

public ActionResult SubmitUserName(string user-name) {...} 

firma del método anterior no funciona por alguna razón ;-)

Sé que es un ActionNameAttribute para manejar la situación con un guión en el nombre de la acción. ¿Hay algo como ParameterNameAttribute?

+0

¿Realmente necesita utilizar el tablero? –

+0

¿es ** obligatorio ** ser 'user-name'? – Buildstarted

+0

No se requiere en absoluto. Es desconcertante que MVC no haya pensado en este escenario. Realmente no lo uso, solo curiosidad si está allí ... o por qué no está allí. –

Respuesta

12

Como todo el mundo ha señalado, la solución más fácil sería no estar usa un guion Si realmente necesita el tablero, puede crear su propio ActionFilterAttribute para manejarlo.

Algo así como:

[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] 
public class ParameterNameAttribute : ActionFilterAttribute 
{ 
    public string ViewParameterName { get; set; } 
    public string ActionParameterName { get; set; } 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if(filterContext.ActionParameters.ContainsKey(ViewParameterName)) 
     { 
      var parameterValue = filterContext.ActionParameters[ViewParameterName]; 
      filterContext.ActionParameters.Add(ActionParameterName, parameterValue); 
     } 
    } 
} 

A continuación, aplicar el filtro con el método de la acción apropiada:

[ParameterName(ViewParameterName = "user-data", ActionParameterName = "userData")] 
[ParameterName(ViewParameterName = "my-data", ActionParameterName = "myData")] 
    public ActionResult About(string userData, string myData) 
    { 
     return View(); 
    } 

Es probable que desee para mejorar la ParameterNameAttribute para manejar mayúsculas/minúsculas, pero eso sería la idea básica.

+0

Esto no funcionó para mí en MVC 4, ProVega lo hizo –

+0

'OnActionExecuting' debe usar' TryGetValue' para evitar la doble búsqueda de 'ContainsKey' seguida del indexador. –

0

sugeriría hacer algo como esto - a menos que sea necesario para utilizar el atributo user-name (o no lo eres unión a un modelo)

<% using (Html.BeginForm("SubmitUserName")) { %> 
    <%: Html.TextBoxFor(m => m.UserName) %> 
    <input type='submit' value='Send' /> 
<% } %> 
3

Me pareció útil esta respuesta, pero no sé exactamente cómo ayuda el ejemplo proporcionado. Parece que simplemente "cambia el nombre" de un valor que el archivador ya ha proporcionado.

En mi caso, me estaba enviando un servicio externo que publicaba algo así como "body-plain" y no podía controlar el nombre. Así que he modificado esta muestra para tener este aspecto:

[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] 
public class ParameterNameMapAttribute : ActionFilterAttribute 
{ 
    public string InboundParameterName { get; set; } 
    public string ActionParameterName { get; set; } 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     object value = filterContext.RequestContext.HttpContext.Request[InboundParameterName]; 

     if (filterContext.ActionParameters.ContainsKey(ActionParameterName)) 
     { 
      filterContext.ActionParameters[ActionParameterName] = value; 
     } 
     else 
     { 
      throw new Exception("Parameter not found on controller: " + ActionParameterName); 
     } 
    } 
} 

Esto toma realmente en el parámetro "cuerpo simple" por ejemplo, y lo asigna a una ActionParameter he definido en mi controlador. De este modo:

[ParameterNameMap(InboundParameterName = "body-plain", ActionParameterName = "bodyPlainText")] 
    [ParameterNameMap(InboundParameterName = "Thread-Topic", ActionParameterName = "alternateSubject")] 
    public HttpStatusCodeResult Process(string token, string timestamp, string signature, string subject, string sender, string recipient, string bodyPlainText, string alternateSubject) 
    { 
10

Crear una seudo-parámetro en la primera línea del método de acción:

public ActionResult SubmitUserName() 
{ 
    string userName = Request.Params["user-name"]; 
    ... 
} 
+0

Eso ni siquiera compiló para mí. ¿Estás hablando de ApiController? –

+0

Oh, tonto, la pregunta es sobre MVC ... y estoy haciendo Web API. OK entonces. –

+3

Eso funcionó bien para mí en MVC. Upvoted. – ChrisFox

Cuestiones relacionadas