Как отправить группу данных, чтобы они были связаны в действии контроллера? - PullRequest
0 голосов
/ 14 июня 2011

Как мне нужно отправить данные от клиента, чтобы получить их в действии Сохранить ?

В то время как список контактов я получаю в действии Сохранитьнулевой.Я проверил Fiddler, и он отправляет id=1&address=a&id=2&address=b.Я понимаю, что мне нужно что-то сделать для того, чтобы MVC «понял», что существует две разные записи.

Что на практике делается в этом случае?

// Action in ContactController
public ActionResult Save(List<Contact> contacts)
{
     ...
}  

public class Contact
{
    public int Id {get;set;}
    public string Address{get;set;}
}


// View
<div id="contacts">
    <% for(i=0;i<3;i++) { %>
       <input name=<%= list[i].id %> type="text" />
       <input name=<%= list[i].address %> type="text" />
   <% } %>
</div>


<script type="text/javascript">
     var postData = $("#contacts").serialize();
     $.ajax({
             type: "POST",
             url: url,
             data: postData,
             async: false,
             success: function () { ... }
     });  
</script>

Ответы [ 2 ]

0 голосов
/ 14 июня 2011

Я бы порекомендовал вам использовать шаблоны редактора в вашем представлении вместо того, чтобы писать некоторые для циклов:

Например:

public ActionResult Save()
{
    var model = Enumerable.Range(1, 3).Select(x => new Contact());
    return View(model);
}

[HttpPost]
public ActionResult Save(List<Contact> contacts)
{
    ...
}

и в представлении (которое строго типизировано IEnumerable<Contact>):

<div>
    <% using (Html.BeginForm()) { %>
        <%= Html.EditorForModel() %>
        <input type="submit" value="OK" />
    <% } %>
</div>

и внутри шаблона редактора контактов (~/View/Shared/EditorTemplates/Contact.ascx):

<%@ Control 
    Language="C#" 
    Inherits="System.Web.Mvc.ViewUserControl<Contact>" 
%>
<%= Html.TextBoxFor(x => x.Id) %>
<%= Html.TextBoxFor(x => x.Address) %>

Шаблоны редактора обеспечат создание собственных имен для полей ввода.

Теперь все, что осталось, это AJAXify форму:

$('form').submit(function() {
    $.ajax({
        url: this.action,
        type: this.method,
        traditional: true,
        data: $(this).serialize(),
        success: function(result) {
            ...
        }
    });
    return false;
});
0 голосов
/ 14 июня 2011

В вашем примере, если вы измените ручное создание на Html.TextBoxFor

<% Html.TextBoxFor(model => list[i].Address) %>

Это будет работать.Взгляните на статью Фила Хаака

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...