所以我所拥有的是一个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),但遗憾的是没有任何成功。
如果您需要更多信息,代码或其他信息,请告知我们。
答案 0 :(得分:0)
由于表单是动态的,您可能希望在post方法中使用动态模型。尝试这样的事情:
[HttpPost, ValidateAntiForgeryToken]
public ActionResult RegisterForEvent(FormCollection collection)
{
// stuff....
}
你需要做一些工作来解析出来的集合,但它应该有从表单发布的所有。一般来说,我不推荐这个,因为它可能真的失控。拥有一个定义良好的视图模型(就像你在原始帖子中所做的那样)总的来说要好得多。但是,有时你真的需要一些动态的东西,这就完成了工作。