получить данные из действия POST asp.net mvc - PullRequest
1 голос
/ 07 марта 2012

У меня есть данные, отправленные с моим <input type="submit" value ="submit">, который имеет следующий формат (проверено с помощью firebug)

Role1 true
Role1 false
Role1 true
Role1 false
Name1 "Name 1"
Name2 "Name2"

и в моем контроллере

[HttpPost]
public ActionResult GetPostData(ArrayList data)

вопрос в том, какого родапараметры я должен положить в контроллер, чтобы иметь возможность иметь какую-то структуру данных, которая заполняется значениями, отправленными по почте?Я не хочу использовать FormCollection.Я могу создать своего рода PostModel, но все эти данные отправляются через скрытые поля, которые в большинстве случаев динамически генерируются с помощью jquery, поэтому я не могу представить, как можно связать постмодель с полями.

Ответы [ 2 ]

4 голосов
/ 07 марта 2012

Полагаю, вы имели в виду (так как наличие Role1 четыре раза кажется странным):

Role1 true
Role1 false
Role2 true
Role2 false
Name1 "Name 1"
Name2 "Name2"

Вы можете использовать модель вида:

public class MyViewModel
{
    public bool Role1 { get; set; }
    public bool Role2 { get; set; }
    public string Name1 { get; set; }
    public string Name2 { get; set; }
}

и затем:

[HttpPost]
public ActionResult GetPostData(MyViewModel model)
{
    ...
}

И так как я подозреваю, что вы делаете чекбоксы (из-за двойного логического значения для каждой роли, поскольку помощник CheckBox генерирует скрытое поле), вот что я вам предложу:

Модель:

public class RoleViewModel
{
    public bool IsSelected { get; set; }
    public string Name { get; set; }
}

public class EditRolesViewModel
{
    public RoleViewModel[] Roles { get; set; }
}

Контроллер:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var model = new EditRolesViewModel
        {
            Roles = new[]
            {
                new RoleViewModel { Name = "Role 1", IsSelected = true },
                new RoleViewModel { Name = "Role 2", IsSelected = false },
                new RoleViewModel { Name = "Role 3", IsSelected = true },
            }
        };
        return View(model);
    }

    [HttpPost]
    public ActionResult Index(EditRolesViewModel model)
    {
        return View(model);
    }
}

Вид:

@model EditRolesViewModel

@using (Html.BeginForm())
{
    for (int i = 0; i < Model.Roles.Length; i++)
    {
        <div>
            @Html.HiddenFor(x => x.Roles[i].Name)
            @Html.LabelFor(x => x.Roles[i].IsSelected, Model.Roles[i].Name)
            @Html.CheckBoxFor(x => x.Roles[i].IsSelected)
        </div>
    }
    <button type="submit">OK</button>
}

или даже лучше, используя шаблон редактора, который будет отображаться для каждой роли:

@model EditRolesViewModel

@using (Html.BeginForm())
{
    @Html.EditorFor(x => x.Roles)
    <button type="submit">OK</button>
}

и шаблон редактора (~/Views/Shared/EditorTemplates/RoleViewModel.cshtml):

@model RoleViewModel

<div>
    @Html.HiddenFor(x => x.Name)
    @Html.LabelFor(x => x.IsSelected, Model.Name)
    @Html.CheckBoxFor(x => x.IsSelected)
</div>
0 голосов
/ 07 марта 2012

Как и предполагал Дарин, вам следует использовать модель представления.

Таким образом, вы можете передавать данные из контроллера в представление и наоборот.Это очень удобно, когда вы проверяете модель представления, обнаруживаете какую-то ошибку проверки (например, слишком низкое значение) и затем отправляете все данные обратно в представление.

Вы можете найти хорошие инструкции о различных способах«перемещать» данные назад и вперед между клиентом и сервером.

Использование ViewData и реализация классов ViewModel

Представления и ViewModels

Обновление

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

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