ASP.NET Core - значения данных, не связанные при попытке использовать частичное представление для разметки элементов управления формы - PullRequest
0 голосов
/ 13 мая 2019

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

@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));
}

Кто-нибудь знает, что я 'я делаю неправильно?Спасибо

1 Ответ

1 голос
/ 13 мая 2019

Весь ваш подход здесь неверен. Кажется, вы ищете редактор шаблонов. По сути, вам нужно создать частичные представления в Views\Shared\EditorTemplates, которые соответствуют типам или членам перечисления DataType, и добавить туда свой собственный HTML. Например, вы можете создать String.cshtml представление:

@model string
<div class="form-group row">
    <label asp-for="@Model" class="col-lg-2 col-form-label"></label>
    <div class="col-lg-10 input-group">
        <input asp-for="@Model" class="form-control">
    </div>
</div>

Тогда для любого строкового свойства:

@Html.EditorFor(x => x.MyStringProp)

И будет использоваться ваш пользовательский шаблон с правильной привязкой имени.

В качестве альтернативы, вы можете создавать собственные теговые подсказки, но методология для этого немного сложнее, так как вам придется обрабатывать генерацию HTML в коде. Однако если вам интересен такой подход, посмотрите на источник для встроенных помощников тегов и создайте свой собственный на основе этого.

...