Я пытаюсь создать частичное представление, чтобы сэкономить на объеме стандартного кода, который мне нужен при создании форм.Простая версия того, что у меня есть, выглядит следующим образом ...
@model FormRowViewModel
<div class="form-group row">
<label for="@Model.PropertyName" class="col-lg-2 col-form-label">@Model.Label</label>
<div class="col-lg-10 input-group">
<input type="text" asp-for="@Model.PropertyName" class="form-control">
</div>
</div>
... где FormRowViewModel
выглядит следующим образом ...
public class FormRowViewModel {
public FormRowViewModel(string propertyName, string label) {
PropertyName = propertyName;
Label = label;
}
public string PropertyName { get; set; }
public string Label { get; set; }
}
Идея состоит в том, чтобы использовать егов таком виде ...
@model ContactViewModel
<form method="post" asp-controller="Home" asp-action="Index">
<div asp-validation-summary="All" class="text-danger"></div>
@await Html.PartialAsync("_FormRow", new FormRowViewModel("UserName", "Your name"))
@await Html.PartialAsync("_FormRow", new FormRowViewModel("Email", "Email"))
@await Html.PartialAsync("_FormRow", new FormRowViewModel("Telephone", "Telephone"))
<div class="form-group row">
<div class="offset-sm-2 col-lg-10">
<button type="submit" class="btn btn-primarySubmit</button>
</div>
</div>
</form>
Это работает, поскольку он создает HTML (почти), как ожидалось, но имеет две проблемы ...
1) Сгенерированный HTMLвключает в себя value
атрибуты, которые устанавливают содержимое текстовых полей для имен свойств ...
<input type="text" class="form-control" id="PropertyName"
name="PropertyName" value="UserName">
2) Что бы я ни вставил в текстовые поля, когда форма отправляется обратно на сервер, модель представленияСвойства - все пустые строки.Даже добавленные имена свойств не отображаются.
В случае, если это помогает, вот действие контроллера, которое обрабатывает представление ...
public IActionResult Index() =>
View();
[HttpPost]
public IActionResult Index(ContactViewModel vm) {
if (!ModelState.IsValid) {
return View(vm);
}
// Next line added so I can see when it worked
return RedirectToAction(nameof(Privacy));
}
Кто-нибудь знает, что я 'я делаю неправильно?Спасибо