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

时间:2017-07-10 17:37:18

标签: c# asp.net asp.net-mvc razor dynamicform

所以我所拥有的是一个HTML表单,使用户能够注册sportsevents。用户可以注册不同的配置文件(例如他的孩子),并且每个事件都可能具有所谓的“附加属性”,例如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"/>
}

由于我不创建这些事件,我不知道这些“附加属性”是什么样的,这就是为什么它们是使用DynamicForm动态呈现的。 我的问题是我无法访问控制器中这些属性的用户输入。当我检查浏览器的控制台时,我看到输入被发布,但是检查动态表单的值,它总是显示“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");
    }

正如您所看到的,我尝试使用Form的“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获取值,因为这在旧版本中有效,您只能在一次注册一个配置文件。 Session-variable在ActionResult中被赋值,返回上面的View。

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

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

1 个答案:

答案 0 :(得分:0)

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

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

你需要做一些工作来解析出来的集合,但它应该有从表单发布的所有。一般来说,我不推荐这个,因为它可能真的失控。拥有一个定义良好的视图模型(就像你在原始帖子中所做的那样)总的来说要好得多。但是,有时你真的需要一些动态的东西,这就完成了工作。