Передача вложенных списков из View в Controller с использованием viewmodels - PullRequest
1 голос
/ 24 марта 2011

Я Франческо и я новичок. У меня проблема с ASP.NET MVC3 в отношении данных, размещаемых между View и Controller. Моя цель - использовать форму для редактирования определенной записи из моей базы данных, а затем отправить ее обратно на контроллер, который отвечает за проверку полей записи и отправку их в базу данных. Данные передаются из контроллера в представление с помощью ViewModel, и поэтому привязка DefaultDataBinding в этом случае не применяется. Я перепробовал много подходов, я контролировал общение с Fiddler, но не смог решить свою проблему. Метод, описанный Филом Хааком , не работает, как и FormCollection.

Здесь у вас есть код:

ViewModels: я передаю его в View для создания таблицы. Имя и список имен элементов (заголовки столбцов таблицы) только для отображения. Я хочу получить Id, Месяц (они передаются правильно в качестве параметров и представляют заголовки строк таблицы) и, что наиболее важно, ActualValue элементов и их Id (у меня есть таблица ассоциации в моей базе данных с Id, Itemid и Month как ключи)

public class EditViewModel
{
    [ScaffoldColumn(false)]
    public int Id { get; set; }

    [ScaffoldColumn(false)]
    public int Month { get; set; }

    public string Name { get; set; }

    public List<ItemViewModel> ItemList { get; set; }
}

public class ItemViewModel
{
    [ScaffoldColumn(false)]
    public int ItemId { get; set; }

    public string ItemName { get; set; }

    public float ActualValue { get; set; }
}

Представление: представление строго типизировано как ViewModels.EditViewModel и отправляет поля с помощью кнопки отправки. Я должен сгенерировать таблицу, используя циклы foreach , потому что я не знаю, сколько элементов заранее

Контроллер. Контроллер должен обновлять каждое значение kpi, передаваемое из представления, связанного с определенным идентификатором и месяцем.

            [HttpPost]
    public ActionResult EditMonth(int Id, int Month, //FormCollection kpiValues)

Надеюсь, я был достаточно ясен и с нетерпением жду помощи. Большое спасибо!

1 Ответ

1 голос
/ 26 марта 2011

Вот предположение: ваш метод контроллера (EditMonth) ищет два параметра: Id и Month. По умолчанию эти имена будут искать связыватель в запросе, который отправляется обратно на сервер, когда пользователь нажимает кнопку отправки.

Тем не менее, я подозреваю, что свойства на отображаемой странице имеют имена, похожие на EditViewModel_Id и EditViewModel_Month. Поэтому связующее не сможет их сопоставить.

Вы можете переопределить действия связывателя по умолчанию. Но я думаю, что более простой подход - переопределить метод EditMonth, чтобы он ожидал объект EditViewModel:

[HttpPost]
public ActionResult EditMonth( EditViewModel model )
{...

Затем имена должны совпадать (вы, конечно, захотите проверить ModelState.IsValid, чтобы убедиться, что связыватель не столкнулся с проблемами при установке объекта EditViewModel).

Кстати, кое-что, что я нашел полезным, это посмотреть на источник на странице, отображаемой в браузере. После этого вы сможете увидеть точные имена, по которым связыватель будет искать совпадения (это атрибуты name = ... в элементах HTML).

...