2014-11-29 2 views
0

В настоящее время я разрабатываю Framework для создания динамических представлений в MVC, идея основана на этом tutorial.Несколько динамических кнопок Submit в MVC

Следующий шаг - добавление возможности создания нескольких кнопок отправки, но я не могу заставить его работать. Я провел некоторое исследование и нашел подход this. Однако, поскольку я хочу динамически генерировать эти кнопки, это пока не работает.

То, что я пытался это изменить этот атрибут код здесь:

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)] 
public class MultipleButtonAttribute : ActionNameSelectorAttribute 
{ 
    public string Name { get; set; } 

    public string Argument { get; set; } 

    public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo) 
    { 
     var isValidName = false; 
     var keyValue = string.Format("{0}:{1}", Name, Argument); 

     var value = controllerContext.Controller.ValueProvider.GetValue(keyValue); 

     if (value != null) 
     { 
      controllerContext.Controller.ControllerContext.RouteData.Values[Name] = Argument; 
      isValidName = true; 
     } 

     return isValidName; 
    } 
} 

При отладке я выкопал вниз ValueProvider и выяснили, что JQueryFormValueProvider в Сборнике Valueproviders фактически содержит имя нажатого submitbutton.

Кнопка генерируется следующим образом:

<input type="submit" name="buttonClick:@Model.Id" value="@Model.Text" /> 

Here is the Value i am looking for

К сожалению ValueProviders не позволяет мне Перебрать Ключи, так что я не знаю, как получить значение я обведенный красным на скриншоте выше , Он не должен быть таким, все, что имеет значение, чтобы узнать, какая кнопка была нажата.

ответ

0

Ok я нашел решение путем изменения атрибутов кода:

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)] 
public class NameToRouteDataAttribute : ActionNameSelectorAttribute 
{ 
    /// <Summary>Name of the Value you want to grab from the control.</Summary> 
    public string Name { get; set; } 

    public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo) 
    { 
     ValueProviderCollection providers = controllerContext.Controller.ValueProvider as ValueProviderCollection; 

     if (providers != null) 
     { 
      // We need this value-Provider as it contains the Data from the Form 
      JQueryFormValueProvider formProvider = providers.OfType<JQueryFormValueProvider>().FirstOrDefault(); 
      if (formProvider != null) 
      { 
       // now look for the specified value-prefix. 
       var kvp = formProvider.GetKeysFromPrefix(Name).FirstOrDefault(); 
       if (kvp.Key != null) 
        controllerContext.Controller.ControllerContext.RouteData.Values[Name] = kvp.Key; 
      } 
     } 
     return true; 
    } 
} 

Contollercode:

[HttpPost] 
    [NameToRouteDataAttribute(Name = "buttonClick")] 
    public ActionResult Show(FormViewModel form) 
    { 
     string buttonId = RouteData.GetRequiredString("buttonClick"); 

     ... 
    } 

Buttoncode

@model MvcForms.Controls.ButtonViewModel 
<input type="submit" name="[email protected]" value="@Model.Text" /> 

Важным здесь является то, что имя кнопки содержит точку. Это делает работу JQueryFormValueProvider.GetKeysFromPrefix так, как мне это нужно.

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