Asp.NET MVC Значение DynamicForm опубликовано, но не передано контроллеру
Итак, у меня есть HTML-форма, позволяющая пользователю регистрироваться на спортивные мероприятия. Пользователь может зарегистрировать разные профили (например, своих детей), и каждое событие может иметь так называемые "дополнительные атрибуты", такие как текстовые поля для размера футболки и т. Д.
@model Models.EventRegistrationModel
@{
Layout = null;
var playerCount = Model.PlayersToRegister.Count;
}
@using (Html.BeginForm("RegisterForEvent", "Event", FormMethod.Post)){
@Html.AntiForgeryToken()
<div class="form-group">
@for (int i = 0; i < playerCount; i++)
{
<div>
<p>@Model.PlayersToRegister[i].User.FullName</p>
</div>
<div
@Html.CheckBoxFor(model => Model.PlayersToRegister[i].PlayerShallGetRegistered)
</div>
//this is the "Additional Attributes"-section for each user-profile
@Html.Raw(Model.PlayersToRegister[i].Form.RenderHtml())
}
</div>
<input type="submit" value="Confirm Registration"/>
}
Поскольку я не создаю эти события, я не могу знать, как выглядят эти "Дополнительные атрибуты", поэтому они отображаются динамически с использованием DynamicForm. Моя проблема в том, что я не могу получить доступ к пользовательскому вводу этих атрибутов в контроллере. Когда я проверяю консоль браузера, я вижу отправляемый ввод, но проверяя значение динамической формы, он всегда говорит "ноль". Вот мой контроллер:
[HttpPost, ValidateAntiForgeryToken]
public ActionResult RegisterForEvent(EventRegistrationModel model)
{
for (int i = 0; i < playerList.Count; i++)
{
var form = Session["Form" + i] as Form;
model.PlayersToRegister[i].Form = form;
//var test = form
//var testtest = test.GetResponses(false);
}
return RedirectToAction("EventOverview");
}
Как вы можете видеть, я пытался использовать метод GetResponses, но он вернул ноль.
public List<Response> GetResponses(bool completedOnly)
{
return InputFields.OrderBy(inputField => inputField.DisplayOrder).Select(field => new Response
{
Title = field.Title, Value = field.Response
}).Where(response => !completedOnly || !String.IsNullOrEmpty(response.Value)).ToList();
}
В данный момент я пытаюсь получить значения через сеанс, так как это работало в более старой версии, где вы могли зарегистрировать только один профиль за раз. Переменная Session присваивается в ActionResult, возвращая вышеуказанное представление.
В последние дни я пробовал разные решения из разных тем (например, ModelState.Clear), но, к сожалению, ничего не получилось.
Если вам нужна дополнительная информация, код или что-то еще, пожалуйста, дайте мне знать.
1 ответ
Поскольку ваша форма является динамической, вы можете использовать динамическую модель в методе post. Попробуйте что-то вроде этого:
[HttpPost, ValidateAntiForgeryToken]
public ActionResult RegisterForEvent(FormCollection collection)
{
// stuff....
}
Вам придется проделать небольшую работу по разбору входящей коллекции, но в ней должно быть все, что было отправлено из формы. В общем, я не рекомендую это, поскольку это может действительно выйти из-под контроля. Наличие хорошо определенной модели представления (как вы делали в первоначальной публикации) в целом намного лучше. Однако иногда вам действительно нужно что-то динамичное, и это выполняет работу.