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 中所做的那样)要好得多。但是,有时您确实需要一些动态的东西,而这可以完成工作。
所以我有一个 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 中所做的那样)要好得多。但是,有时您确实需要一些动态的东西,而这可以完成工作。