Передача IEnumerable в представление для генерации формы, а затем передача данных формы обратно в контроллер - PullRequest
0 голосов
/ 21 сентября 2019

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

например, строка, извлеченная из базы данных, будет выглядеть следующим образом

Claim #: |string^clmNum^Claim Number: | - Ref#: |string^RefNum^Reference Number: |

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

Claim #: 123456 - Ref#: 789012

Это то, чем я занимаюсь до сих пор ...

Разделы между |извлекаются, разделяются и загружаются в IEnumerable

Моя модель foo:

public class Foo
{
   public string InputType {get; set;}
   public string InputName {get; set;}
   public string InputLabel {get; set;}
}

Я передаю IEnumerable в представление с помощью ViewModel

public class FormBuildViewModel
{

   public IEnumerable<Foo> FooProperty {get; set;}

}

Затем я динамически отображаю элементы ввода со следующей разметкой Razor.

<form>
@{ var e = Model.FooProperty.ToList();


    foreach (var subItem in e)
    {
       <div class="FormGroup-items">
         <label>@subItem.InputLabel</label>
         <input name="@subItem.ObjName" type="text" />
       </div>
    }
 }
<..// form button stuff //..>
</form>

, которая создает следующий HTML-код:

<form>
    <div class="FormGroup-items">
        <label>Claim Number: </label>
        <input name="clmNum" type="text" />
    </div>
    <div class="FormGroup-items">
        <label>Reference Number: </label>
        <input name="RefNum" type="text" />
    </div>

    <..// button stuff //..>
</form>

У меня все работает до этого момента.Мне нужно взять данные, введенные в динамически созданную форму, и вернуть их в контроллер таким образом, чтобы я мог индексировать их, чтобы перестроить строку.

Я пытался использовать форму @ html.begin, похожую на эту

@using (Html.BeginForm())
{
    @for(int i=0; i<Model.Count; i++)
    {
       @Html.CheckBoxFor(m => m[i].IsActive, new { @value = Model[i].Id })
       @Html.DisplayFor(m => m[i].Name)
    }
    <input type="submit" value="Save" />
}

, но для использования @ Html.BeginForm вам нужно знать имена элементов до выполнения, и это непохоже, не работает с динамически созданной формой, подобной этой.

Единственное, о чем я могу думать, это то, что мне нужно загрузить данные формы в List и вернуть их в контроллер, но я не могу придумать, как заставить C # позволить мнеинициализировать список и загрузить значения в представлении.Я знаю, что я должен что-то упустить, но сейчас я немного потерян.Любая помощь будет оценена.

1 Ответ

1 голос
/ 21 сентября 2019

Вы передаете свою модель просмотра обратно на свою страницу?Похоже, что вы устанавливаете модель представления с данными по крайней мере из представления 5000 футов:

[HttpGet]
public IActionResult MyCallMethod()
{
    FooProperty = getmydatafromsomewhere();

    return View(); 
}

Тогда ваша страница будет иметь способ построить соответственно

@model My.Name.Space.MyViewModel

@using (Html.BeginForm("Action", "Controller"))
{
    @foreach (var item in @Model.FooProperty)
    {
    <div class="FormGroup-items">
        <label asp-for="item.InputType" />
        <input asp-for="item.InputType" class="form-control" />
    </div>
    //other data

    }
}

Я также предполагаю, что у вас естьнастройка поста на контроллере.

[HttpPost]
public IActionResult MyCallMethod(MyViewModel viewModel)
{
        //do something with the viewmodel here
        //same page, somewhere else, do something else, etc.
}

Вы также можете использовать некоторые помощники тегов для своих ярлыков и входных данных, если выберете:

@Html.LabelFor(m => item.InputType, new { @class="whateverIwant" })
@Html.TextBoxFor(m => item.InputType, new { @class="form-control" })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...