Ситуация: в некоторых программах управления проектами, написанных на asp.net, у меня есть страница создания проекта (работает нормально). Мне нужно добавить к этому возможность добавлять задачи из списка шаблонов в предварительное создание этого проекта, НО список доступных задач зависит от некоторых значений, находящихся в форме создания.
Мое абстрактное решение таково:
- У меня есть представление «Создать» и представление «Добавить задачи» - оба строго типизированы для составной модели представления, определенной в контроллере.
- Мой метод Create проверяет, какая кнопка использовалась для его вызова — если кнопка была «Добавить задачи», она затем отображает представление AddTasks, передавая модель из представления создания, снова все в том же контроллере.
- Представление AddTasks публикуется в представлении Create с помощью одной из двух кнопок, одна из которых загружает представление, а другая вызывает фактическое сохранение БД.
Моя проблема заключается в следующем:
- Разные представления используют разные свойства одной и той же модели, но при передаче этой модели между ними данные сбрасываются (в любом случае перезагружаются или сохраняются).
- Я предполагаю, что это происходит из-за автоматической привязки данных, хотя я думал, что поля, отсутствующие в форме, не будут перезаписывать существующие данные модели, переданные вниз.
- В настоящее время в контроллере практически нет кода, управляющего моделью — в этих случаях он передается только из представления в представление.
Это код контроллера:
// POST: /Project/Create/<viewModel>
[Authorize, AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create([Bind(Exclude = "Id,id")] ProjectViewModel model)
{
if (model.SubmitValue == "Create")
{
try
{
model.Project.Id = Guid.NewGuid();
model.Save(this.User.Identity.Name);
return this.RedirectToAction("Details", new {id = model.Project.Id});
}
catch (Exception e)
{
this.ModelState.AddModelError(e.ToString(), e.ToString());
}
return View(model);
}
if(model.SubmitValue == "AddTasks")
{
return this.View("AddTasks",model);
}
return this.View(model);
}
//POST: /Project/AddTasks/ + model
[Authorize, AcceptVerbs(HttpVerbs.Post)]
public ActionResult AddTasks([Bind(Include = SelectedCarrierTasks")]ProjectViewModel model)
{
return View(model);
}
Вопрос: как поддерживать состояние модели в этих представлениях до тех пор, пока она ее не сохранит?
Я бы предпочел избегать любых хакерских (TempData) или зависимых от JS решений, но я не закрыт для них, если они действительно являются лучшим решением.
Спасибо, Адам Толли.