2016-07-12 2 views
0

Я использую специально разработанные элементы ввода, которые не могут использовать теги ввода, поэтому вместо этого я создаю и отправляю форму с помощью Javascript, например, this. Короче говоря:
Отправка динамически сгенерированной формы с помощью JavaScript в MVC

var form = document.createElement("form"); 
var hiddenField = document.createElement("input"); 
hiddenField.setAttribute("type", "hidden"); 
hiddenField.setAttribute("name", "id["+index+"]"); 
hiddenField.setAttribute("value", this.id); 
form.submit(); 

Сейчас, насколько я знаю, в моем контроллере MVC я должен получить данные, как так:

public ActionResult Submit(string a = null, string b = null...) 
{ 
    //something 
} 

Моя проблема с этим состоит в том, что данные, которые я вношу с этой формой очень просто и является ТОЛЬКО списком переменной длины неизвестных чисел, которые служат идентификаторами полей. Например:
[1,2,5,3,10,199999]
, и я не имею понятия диапазона или количества этих идентификаторов. Как отправить эти данные на мой MVC-страницу?

EDIT: Текущий выбранный ответ действительно отвечает на вопрос, как я его просил. У меня не было возможности проверить это до сих пор, но поддержки FormData в IE9 нет. Есть ли какой-либо недостаток, который я могу использовать, чтобы получить тот же результат в IE9?

+0

Вы должны опубликовать список целых чисел и получить его как 'int []'. –

+0

Не совсем понимаю, почему это «слишком широко», но я буду редактировать. – Timestretch

ответ

1

Выполните следующие действия:

Если вы не знаете, количество строк прошло, или они могут изменяться, использовать Params [] вместо:

[HttpPost] 
    [ValidateJsonAntiForgeryToken] 
    //See this: http://stackoverflow.com/a/24394578/1057052 
    public ActionResult Submit(params string[] a) 
    { 
      //Read it like this! 
      foreach (var myvar in a) 
      { 
      //Do whatever you want with it! 
      }   
    } 

Создать новый файл с именем ValidateJsonAntiForgeryTokenAttribute:

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple= false, Inherited = false)] 
    public sealed class ValidateJsonAntiForgeryTokenAttribute : FilterAttribute, IAuthorizationFilter 
    { 
     public void OnAuthorization(AuthorizationContext filterContext) 
     { 
      if (filterContext == null) 
      { 
       throw new ArgumentNullException("filterContext"); 
      } 

      var httpContext = filterContext.HttpContext; 
      var token = httpContext.Request.Headers["__RequestVerificationToken"] ?? httpContext.Request.Form["__RequestVerificationToken"]; 
      var cookie = httpContext.Request.Cookies[AntiForgeryConfig.CookieName]; 
      AntiForgery.Validate(cookie != null ? cookie.Value : null,token); 
     } 
    } 

И это в вашем .cshtml или .js файл:

<script> 
function AjaxSubmit(Url,Method, data, success) 
{ 
    $.ajax({ 
     url: Url, 
     method: Method, 
     data: data, 
     contentType: false, 
     processData: false, 
     //Protect 
     headers: {"__RequestVerificationToken" : document.getElementsByName('__RequestVerificationToken')[1].value}, 
     success: success 
     }); 
    } 
} 


//use it like this: 

var formData = new FormData(); 
    /** 
    * Note: The "a" is the "key" or the name of the parameter 
    * of your MVC controller. 
    * The second parameter of the formData.append is the actual data 
    * that you want to pass. 
    * 
    **/ 
    formData.append('a', "The Value I want to append. You can query for this value"); 
    formData.append('a', "The Value I want to append. You can query for this value"); 
    formData.append('a', document.getElementById('js-element').value); 

    //You can modify alert("Success") for whatever the function you want. 
    //Just remember to wrap it inside function(){} 
    AjaxSubmit("/MyController/Submit", "POST", formData, function(){alert("Success")}); 

</script> 
+1

Это сработало для меня, за исключением того, чтобы получить данные для формирования массива, вместо 'formData.append ('a',« Значение, которое я хочу добавить, вы можете запросить для этого значения »); formData.append ('a', "Значение, которое я хочу добавить, вы можете запросить для этого значения"); ' вы должны сделать ' formData.append ('[0]', "Значение, которое я хочу append. Вы можете запросить это значение "); formData.append ('[1]', "Значение, которое я хочу добавить. Вы можете запросить для этого значения"); ... ect' – Timestretch

+1

@Timestretch: cool: D. Да, это так. В следующий раз, когда вы пытаетесь сделать сложный объект (класс, который вы создали сами), вы помещаете имя параметра, определенного в методе действий, и добавляете индексы. Например, в этом случае параметр называется «a», поэтому он будет «a [0]», «a [1]» и т. Д. –

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