2013-11-26 2 views
0

Я борюсь с созданием правильного запроса AJAX для отправки данных формы и дополнительного массива на контроллер MVC.Модель POST плюс дополнительный массив для ASP.NET MVC-контроллера

[HttpPost, AjaxOnly] 
public ActionResult GetAttributeViews(AddComponentsDialogModel model, List<int> attributeIDs) 

Вот метод, который я пытаюсь получить.

// Post the model to GetAttributeViews: 
$.ajax({ 
    type: 'POST', 
    url: '../Component/GetAttributeViews', 
    data: $('form').serialize() 
}); 

// Post the integer array to GetAttributeViews: 
$.ajax({ 
    type: 'POST', 
    url: '../Component/GetAttributeViews', 
    data: { 
     attributeIDs: [1, 2, 3] 
    }, 
    traditional: true 
}); 

Однако каждая попытка, которую я сделал для публикации обоих свойств, приводит к тому, что модель равна нулю. Я пробовал JSON.stringify, $ .param ({}, true), а также задавал параметры dataType и contentType запроса AJAX. Ничто из этого не помогает.

Каков правильный способ опубликовать оба эти значения на моем контроллере и перевести мою модель MVC в модель?

Вот мнение в вопросе:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<CableSolve.Web.Models.Component.AddComponentsDialogModel>" %> 

<% Html.BeginForm(); %> 

    <div class="editableContentWrapper twoColumnLayout"> 
     <fieldset class="collapsible" id="<%= Model.AddComponentsLegendName.Replace(" ", "_") + "_Fieldset" %>"> 
      <legend> 
       <%= Html.DisplayFor(model => model.AddComponentsLegendName)%> 
      </legend> 
      <div class="collapsibleDiv"> 

       <div class="detailsRow required"> 
        <%= Html.LabelFor(model => model.NameStart, Model.NameStartLabel)%> 
        <%= Html.EditorFor(model => model.NameStart) %> 
       </div> 
       <div class="detailsRow"> 
        <%= Html.LabelFor(model => model.NameEnd, Model.NameEndLabel)%> 
        <%= Html.EditorFor(model => model.NameEnd)%> 
       </div> 
       <div class="detailsRow required"> 
        <%= Html.LabelFor(model => model.RequiredSpaceLookup, Model.RequiredSpaceLookupLabel)%> 
        <%= Html.EditorFor(model => model.RequiredSpaceLookup)%> 
       </div> 
       <div class="detailsRow required"> 
        <%= Html.LabelFor(model => model.RequiredTemplateLookup, Model.RequiredTemplateLookupLabel)%> 
        <%= Html.EditorFor(model => model.RequiredTemplateLookup)%> 
       </div> 
       <div class="detailsRow"> 
        <%= Html.LabelFor(model => model.BarcodeStart, Model.BarcodeStartLabel)%> 
        <%= Html.EditorFor(model => model.BarcodeStart)%> 
       </div> 
       <div class="detailsRow"> 
        <%= Html.LabelFor(model => model.BarcodeEnd, Model.BarcodeEndLabel)%> 
        <%= Html.EditorFor(model => model.BarcodeEnd)%> 
       </div> 

      </div> 
     </fieldset> 
    </div> 

    <div class="editableContentWrapper twoColumnLayout"> 
     <fieldset class="collapsible" id="<%= Model.AttributesLegendName.Replace(" ", "_") + "_Fieldset" %>"> 
      <legend> 
       <%= Html.DisplayFor(model => model.AttributesLegendName) %> 
      </legend> 
      <div class="collapsibleDiv attributeControlArea"> 
       <%= Html.EditorFor(model => model.Attributes) %> 
      </div> 
     </fieldset> 
    </div> 

<% Html.EndForm(); %> 

<button type="button" class="addAttributes">Add Attributes</button> 
<button type="button" class="clearAttributes">Clear Attributes</button> 

<div id="AddAttributesLookup"></div> 

Идея заключается в том, что атрибуты будут пустыми на первом прогоне, но клиент может выбрать несколько идентификаторов атрибутов, которые я хотел бы загрузить взгляды на то же время помня все от текущих данных. Итак, я хотел бы передать текущее состояние моей модели вместе со списком идентификаторов атрибутов обратно на мой контроллер, чтобы он мог создать новое представление, которое учитывает эти идентификаторы.

+0

Не могли бы вы также опубликовать свой «Просмотр»? –

+0

Ухх, конечно! Я отредактирую его в исходное сообщение. –

+0

@AlexFilipovici Почему нужен код 'View'? Описанная здесь проблема связана только с «HTTP POST» и «Controller». – Shiva

ответ

0

Просто попробуйте это. Это сработало для меня.

var data = new Object(); 
    data = { 
     model: { ID: "1", Name: "Test" }, // <<-- This is temporary AddComponentsDialogModel object 
     attributeIDs: [1, 2, 3] 
    }; 
    $.ajax({ 
     type: 'POST', 
     url: '@Url.Content("~/Home/GetAttributeViews")', 
     contentType: "application/json; charset=utf-8", 
     data: JSON.stringify(data) 
    }); 
1

Создайте модель представления, содержащую как вашу модель домена, так и ваш массив. Вы также можете сделать свою жизнь проще, используя AJAX form instead of an Html form, таким образом, структура MVC будет заботиться о POST для вас.

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