Передача сложного объекта из представления в контроллер / представление в ASP.NET MVC - PullRequest
3 голосов
/ 21 декабря 2009

В моем приложении MVC у меня проблема с передачей данных из представления в контроллер. У меня довольно сложные доменные классы:

public class TaskBase : PersistableObject
{
    public virtual TaskCategory Category { get; set; }
    public virtual IList<TaskNote> Notes { get; set; }
    public virtual string TaskTitle { get; set; }
    public virtual string TaskBody { get; set; }
    public virtual DateTime? CreationTime { get; set; }
    public virtual User CreatedBy { get; set; }
    public virtual int CompletionRatio { get; set; }
}

public class MainTask : TaskBase
{
    public virtual IList<TaskBase> ChildTasks { get; set; }
    public virtual User AssignedTo { get; set; }
    public virtual IList<TaskHistory> History { get; set; }
}

public class TaskFormModel : ViewDomainBase
{
    public MainTask Task { get; set; }
    public LoginForm LoginInfo { get; set; }
}

И, на мой взгляд, я хочу передать экземпляр TaskFormModel в контроллер.

<%= Html.ActionLink<TaskController>("Edit Task", (x) => x.Edit(new TaskFormModel() { Task = item, LoginInfo = Model.LoginInfo }))%>

А вот действие контроллера:

public ActionResult Edit (TaskFormModel taskInfo)
{
    return View(ViewPageName.TaskDetailsForm, task.Task);
}

В этом методе действия taskInfo имеет значение null, даже если я пропускаю ненулевой экземпляр из поля зрения. Я думаю, что у меня есть проблема обязательности здесь. Я думаю, что для написания связывателя пользовательской модели требуется преобразовать каждое свойство, а также, когда добавляются новые поля, также следует изменить класс связывателя, поэтому я не хочу, чтобы связыватель пользовательской модели делал это. Есть ли другой способ передачи данных в контроллер в этом сценарии? Или можно связать пользовательский связыватель модели так, чтобы меньше написанного кода, а также при добавлении новых свойств, класс связывателя не нуждался в изменении?

Редактировать после комментариев: я пытаюсь в основном передать экземпляр из одного представления в другое, не запрашивая репозиторий / db в действии моего контроллера.

Ответы [ 2 ]

4 голосов
/ 21 декабря 2009

Первая версия ответа:

Ваш метод редактирования GET должен выглядеть следующим образом:

public ActionResult Edit (int id)
{
    var model = taskRepository.GetTaskEditModel(id);
    return View(ViewPageName.TaskDetailsForm, model);
}

и ActionLink:

<%= Html.ActionLink("Edit Task", "Edit", "Task", new { model.Task.id })%>

Если вы хотите передать сложные объекты в контроллер, вам нужно обернуть их в html-форму и перейти к действию POST.

1 голос
/ 21 декабря 2009

По-моему, вы делаете что-то не так. Как я понимаю: вы пытаетесь создать новый объект, передать его в браузер и вернуть обратно. ну, вы не можете.

Если объект, который вы хотите отредактировать, уже существует в вашем хранилище, вам следует изменить свой ActionLink, чтобы он ссылался на него по id, и создать его экземпляр внутри действия Edit.

Взгляните на строго типизированные индексные представления по умолчанию, созданные инструментами.

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