Asp.NET DynamicForm 的 MVC 值已发布但未传递给控制器

Asp.NET MVC Value of DynamicForm posted but not passed to controller

所以我有一个 HTML-Form 使用户能够注册体育赛事。用户可以注册不同的配置文件(例如他的 children),每个事件都可能有所谓的 "Additional Attributes",例如 T-Shirt-size 等的文本框

@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"/>
}

因为我没有创建这些事件,所以我无法知道这些 "Additional Attributes" 是什么样子,这就是它们使用 DynamicForm 动态呈现的原因。 我的问题是我无法访问控制器中那些属性的 user-input。当我检查浏览器的控制台时,我看到正在发布的输入,但检查动态表单的值时,它总是显示 "null"。 这是我的控制器:

[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"-Method,但它返回了 null。

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-variable 在返回上述视图的 ActionResult 中分配。

过去几天我一直在尝试各种线程的各种解决方案(例如 ModelState.Clear),但遗憾的是没有任何成功。

如果您需要更多信息、代码或其他信息,请告诉我。

由于您的表单是动态的,您可能希望在 post 方法中使用动态模型。尝试这样的事情:

[HttpPost, ValidateAntiForgeryToken]
public ActionResult RegisterForEvent(FormCollection collection)
{
    // stuff....
}

您需要做一些工作来解析传入的集合,但它应该包含从表单post编辑的所有内容。一般来说,我不推荐这样做,因为它真的会失控。一般来说,拥有一个定义良好的视图模型(就像你在原来的 posting 中所做的那样)要好得多。但是,有时您确实需要一些动态的东西,而这可以完成工作。