Я пытаюсь написать общую платформу для помощи в разработке форм в стиле мастера.
У меня есть модель со свойствами, представляющими каждый шаг в мастере, например,
public class ExampleWizardTransaction : WizardTransaction
{
public override TransactionType TransactionType { get; set; } = TransactionType.ExampleWizard;
public override string ControllerName { get; set; } = "WizardExample";
[DisplayName("Client Details")]
public ClientDetails ClientDetails { get; set; } = new ClientDetails();
[DisplayName("Client Questions")]
public ClientQuestions ClientQuestions { get; set; } = new ClientQuestions();
[DisplayName("Client Preferences")]
public ClientPreferences ClientPreferences { get; set; } = new ClientPreferences();
}
[Step(1)]
public class ClientDetails : IStep
{
[Display(Description = "Please enter your first name")]
public string FirstName { get; set; }
[Display(Description = "Please enter your last name")]
public string LastName { get; set; }
}
[Step(2)]
public class ClientQuestions : IStep
{
[DisplayName("What is your favourite car?")]
public string FavouriteCar { get; set; }
[DisplayName("What is your favourite holiday destination?")]
public string FavouriteDestination { get; set; }
}
[Step(3)]
public class ClientPreferences : IStep
{
[DisplayName("Red or Blue?")]
public Colours Colour { get; set; }
[DisplayName("Do you like Indian food")]
public bool LikeFood { get; set; }
}
Изначально у меня было частичное представление для каждого шага мастера, которое выглядело так:
@model Web.Models.ExampleWizard.Create
<div class="row">
<div class="col-md-6">
@Html.EditorFor(x => x.ExampleWizardTransaction.ClientDetails)
</div>
</div>
Используя это, значения моей формы связываются правильно, так как, когда я публикую ее, MVC знает контекст привязки.
В моей форме я отрисовываю частичное представление, передавая номер шага, например
Html.RenderPartial($"_CreateWizard_{Model.ExampleWizardTransaction.CurrentStep}", Model);
Я пытаюсь обобщить код, чтобы мне не нужно было включатьчастичное представление для каждого шага в мастере.
Для этого я выполняю действие, которое определяет, какой тип связан с шагом мастера, и возвращаю частичное представление:
Html.RenderAction("GetStep", "ExampleWizard", Model.ExampleWizardTransaction);
В моем частичном представлении указывается интерфейс, который каждыйшаг мастера реализует:
_WizardStep.cshtml
@model Services.ViewModels.Wizard.IStep
<div class="row">
<div class="col-md-6">
@Html.EditorFor(x => x)
</div>
</div>
Когда я использую вышеупомянутое, форма отображается правильно, но значения больше не связываются на POST,что я предполагаю, потому что он не имеет привязки контекста для свойств (например, идентификатор и имя типов ввода не полностью определены).
У меня есть шаблон EditorFor для свойств строки на шагах мастера, который отображает текстовое поле:
@model string
<div class="col-md-12">
<div class="form-group">
<label class="m-b-none" for="@ViewData.Model">
@ViewData.ModelMetadata.DisplayName
</label>
<span class="help-block m-b-none small m-t-none">@ViewData.ModelMetadata.Description</span>
<div class="input-group">
@Html.TextBox("", Model, new {@class = "form-control"})
<div class="input-group-addon">
<i class="fa validation"></i>
</div>
</div>
</div>
</div>
Можно ли использовать мой общий частичный вид "_WizardStep.cshtml" и по-прежнему связыватьсясвойства текущего шага к моей модели?
Мой контроллер выглядит следующим образом:
[HttpPost]
public virtual ActionResult CreateWizard(Create model, string action)
{
var createModel = CreateModel<Create>();
switch (createModel.Save(action))
{
case WizardState.Finished:
return RedirectToActionWithMessage("List", "Transaction", "Completed", ToastNotificationStatus.Success);
case WizardState.Ongoing:
return RedirectToAction(MVC.ExampleWizard.CreateWizard(
model.ExampleWizardTransaction.Id,
model.ExampleWizardTransaction.GetNextStep(action)));
default:
model.MapExistingTransactions<ExampleWizardTransaction>();
return View(model);
}
}
Моя модель «Создать» содержит мое свойство «ExampleWizardTransaction», которое содержит каждый из шагов мастера, реализующих интерфейс IStep.