#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. Так и было. Большое спасибо за помощь.