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

Что должно быть сигнатурой соответствующего метода действий для принятия параметра user-name?Использование тире (-) в параметрах ASP.MVC

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

Метод подпись выше не работает по какой-то причине ;-)

Я знаю, что есть ActionNameAttribute, чтобы справиться с ситуацией с тиром в названии действия. Есть что-то вроде ParameterNameAttribute?

+0

вам действительно нужно использовать тир делать? –

+0

это ** требуется **, чтобы быть 'user-name'? – Buildstarted

+0

Это совсем не требуется. Это просто озадачивает, что MVC не думал об этом сценарии. Я на самом деле не использую его, просто любопытно, если его там ... или почему его там нет. –

ответ

12

Как отметил все, проще исправить было бы не используйте тире. Если вам действительно нужна тире, вы можете создать свой собственный ActionFilterAttribute для его обработки.

Что-то вроде:

[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); 
     } 
    } 
} 

Вы бы затем применить фильтр к соответствующему способу действий:

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

Вы, вероятно, хотите, чтобы увеличить ParameterNameAttribute обрабатывать верхний/нижний регистр, но была бы основной идеей.

+0

Это не сработало для меня в MVC 4, ProVega's сделал –

+0

'OnActionExecuting' должен использовать' TryGetValue', чтобы избежать двойного поиска 'ContainsKey', за которым следует индекс. –

0

Я предложил бы делать что-то подобное - если это не требуется, чтобы использовать атрибут user-name (или вы не связываясь с моделью)

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

Я нашел этот ответ полезным, но я не знаю точно, как помогает приведенный пример. Похоже, что просто «переименует» значение, которое все готовое связующее.

В моем случае я был отправлен внешней службой, которая отправила бы что-то вроде «тело-равнина», и я не мог контролировать имя. Таким образом, я изменил этот пример, чтобы выглядеть следующим образом:

[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); 
     } 
    } 
} 

Это фактически принимает в параметре «тело равнины», например, и отображает его на ActionParameter я определила на моем контроллере. Как так:

[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

Создать псевдо-параметр в первой строке методы действия:

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

Это даже не скомпилировало для меня. Вы говорите об ApiController? –

+0

О, глупо меня, вопрос о MVC ... и я занимаюсь веб-API. Хорошо, тогда. –

+3

Это отлично работало для меня в MVC. Upvoted. – ChrisFox

Смежные вопросы