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....
}

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

Другие вопросы по тегам