ASP.Динамически созданные поля NET MVC, не привязанные к FormCollection

#c# #asp.net-mvc-5 #kendo-asp.net-mvc #razor-pages #formcollection

#c# #asp.net-mvc-5 #kendo-asp.net-mvc #razor-страницы #formcollection

Вопрос:

Я создал частичное представление Razor с динамически создаваемыми полями:

 for (int i = 0 ; i < atr.Count; i  )
{
    <div class="col-md-12 panel panel-default sx-box-shadow-on-hover">
        <div class="panel-heading">
            <h2 class="panel-title">
                <a data-toggle="collapse" data-parent="#accordion" href="#@string.Format("{0}{1}", "collapse", @atr[i].Id)" aria-expanded="true">
                    @atr[i].Label
                    <span class="caret"></span>
                </a>
            </h2>
        </div>
        <div id=@string.Format("{0}{1}", "collapse", @atr[i].Id) class="col-md-12 panel-collapse collapse" aria-expanded="true">
            <form>
                <div class="form-group">
                    @switch (atr[i].AtrType)
                    {
                        case "TXT":
                        case "NUM":
                            <input id=@atr[i].Id class="form-control margin5" name=@atr[i].Name type="text" />
                            break;
                        case "CHB":
                            <input class="form-control margin5" name=@atr[i].Name type="checkbox" />
                            break;
                        case "DTP":
                            @(Html.Kendo().DatePicker()
                                                .Name(@atr[i].Name)
                                                .Value(DateTime.Now)
                                                .HtmlAttributes(new { style = "margin-top: 5px; width:100% !important", title = @atr[i].Name })
                            )
                            break;
                        case "WTXT":
                            <textarea name=@atr[i].Name , rows="3"></textarea>
                            break;
                    }
                </div>
            </form>
        </div>
    </div>
}
  

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

Опубликовать действие:

 [HttpPost]
[Authorize]
public ActionResult Search(FormCollection form)
{
    //
}
  

Главная страница Razor:

 @using (Html.BeginForm("Search", "Home", FormMethod.Post))
{
    <div class="col-md-12 panel panel-default sx-box-shadow-on-hover">
        <div class="panel-heading">
            <h2 class="panel-title">
                <a data-toggle="collapse" data-parent="#accordion" href="#searchCollapse" aria-expanded="true">
                    Search options
                    <span class="caret"></span>
                </a>
            </h2>
        </div>
        <div id="searchCollapse" class="col-md-12 panel-collapse collapse in" aria-expanded="true">
            <div class="form-group">
                <label class="col-md-12 fontBold margin5">Document type:</label>
                @(Html.Kendo().DropDownList()
                    .Name("DocumentTypesDropDownList")
                    .DataTextField("Name")
                    .DataValueField("Id")
                    .DataSource(source =>
                    {
                        source.Read(read =>
                        {
                            read.Action("GetDocTypes", "Home");
                        });
                    })
                    .Events(e =>
                    {
                        e.Change("docTypeOnChange");
                    })
                    .HtmlAttributes(new { style = "margin-top: 5px; width:100% !important", title = "DocumentTypesDropDownList" })
                )
                <button id="SearchButton" class="btn btn-primary form-control margin5">Search</button>
                <div id="searchPanelDiv">
                    @{
                        Html.RenderPartial("SearchPanel");
                    }
                </div>
            </div>
        </div>
    </div>
}
  

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

 DocumentTypesDropDownList=1amp;Identificator=1234
  

Параметры из динамических полей отсутствуют.

Комментарии:

1. можете ли вы добавить FormCollection содержимое?

2. Я могу дать вам совет. Попробуйте открыть инструменты разработчика, отправьте запрос контроллеру и проверьте, как выглядит тело запроса POST, и проверьте, какие поля отсутствуют. Это может вам очень помочь при расследовании того, что не так. Может быть вероятность того, что ваши отсутствующие поля находятся в теле, но формат json не совпадает с FormCollection

3. В FormCollection у меня есть 2 значения для ключей «DocumentTypesDropDownList» и «IdentificatorTextBox», которые представляют собой 2 статических поля с основной и частичной страниц. Вот и все.

4. итак, можете ли вы отредактировать, пожалуйста, свой вопрос и затем вставить весь класс

5. У вас есть несколько форм. Одно на главной странице и столько, сколько создается циклом for в partial. Вам нужно переписать часть, чтобы входные данные были встроены как часть родительской формы.

Ответ №1:

Я думаю, если вы разместите это:

 [HttpPost]
[Authorize]
public ActionResult Search(FormCollection form)
{
    var fields = new List<(string, string)>();
    foreach (var item in Request.Form)
    {
        fields.Add((item.Key, item.Value));
    }
    // do some other stuff
}
  

в вашем контроллере вы можете прочитать все поля, расположенные в вашем основном запросе, независимо от того, были ли они добавлены динамически или нет.

Комментарии:

1. Вероятно, есть какая-то возможность создать некоторый метод расширения или собственный атрибут и добавить public List<(string, string) Fields { get; set; } в FormCollection класс с автоматической привязкой, но приведенное выше решение — это просто быстрый способ решения вашей проблемы. Устраняет ли это вашу проблему?

Ответ №2:

Вложенные формы не поддерживаются в HTML.

Если вы удалите теги <form> и </form> из частичного представления, вы должны быть в состоянии захватывать динамические входные данные из FormCollection , которые создаются на главной странице @using (Html.BeginForm .

Комментарии:

1. Так и было. Большое спасибо за помощь.