【问题标题】:How can I handle a dynamically created form submit?如何处理动态创建的表单提交?
【发布时间】:2009-08-24 12:52:08
【问题描述】:

asp.net mvc中如何处理动态生成的表单提交?

表单是动态创建的(元素的数量、顺序和类型总是不同的),我必须在 asp.net mvc 的控制器中处理它(将数据存储在数据库中)(没有视图状态)。输入类型可以是一切;隐藏字段、单选按钮、复选框、文本输入等。

<% using (Html.BeginForm("AddAnswer","Research")){ %>

<%= Html.Hidden("page", ViewData["curentPage"]) %>

<% foreach (var item in Model){ %>

<span><%= Html.Encode(item.Text) %></span>
    <%= Html.ActionLink("Edit", "Edit", new {id=item.QuestionID}) %>
    |
    <%= Html.ActionLink("Details", "Details", new { id=item.QuestionID })%>

    <%switch (item.QuestionTipe.QuestionTipeID){

        case 4:%>
        <table>
            <%foreach (var offeredAnswer in item.OfferedAnswer) {%>
                <tr>
                    <td><%= Html.CheckBox("q" + item.QuestionID, false, new{ value = offeredAnswer.Number})%></td>
                    <td><%= offeredAnswer.Text%></td>
                </tr>
            <%}%>
        </table>
        <% break;

        case 1:%>
        <table>
            <% foreach (var offeredAnswer in item.OfferedAnswer) {%>
                <tr>
                    <td><%= Html.RadioButton("q" + item.QuestionID, false, new{ value = offeredAnswer.Number})%></td>
                    <td><%= offeredAnswer.Text%></td>
                </tr>
            <%}%>
        </table>

        <% break;

        case 2:%>
        <div style="width:220px; height:20px; padding-top:10px; padding-left:8px;">
            <%= Html.TextBox("q" + item.QuestionID, null, new { style = "width:200px;"})%>
        </div>
        <% break;

        case 3:%>
        <div style="width:220px;height:20px; padding-top:10px;padding-left:8px;">
            <div id="q<%= item.QuestionID %>" style="width:200px;" class="slider">
            </div>
            <%= Html.Hidden("q" + item.QuestionID, 0)%>
        </div>
        <% break;
    }%>
<%}%>

<p>
    <input type="submit" value="Sljedeća strana" />
</p>
<%}%>

【问题讨论】:

  • 你能澄清一下你的意思吗?
  • 还不够吗?我不知道该写什么..

标签: asp.net asp.net-mvc webforms form-submit


【解决方案1】:

在您的操作方法中,您可以访问 FormCollection 参数,从那里,您可以访问您从提交操作中传入的所有值。

public ActionResult YourActionMethod(FormCollection form)
{

}

【讨论】:

  • 如果您不知道其中的大小或元素,您将如何处理该表单集合?
  • 我想你可以通过这个来列举。如果传入一个元素的数组,那么就可以直接绑定到一个数组,这样就更简单了。
  • 绑定?我已经动态生成(元素的数量、顺序和类型总是不同的)不能与任何对象绑定的表单。
  • 他告诉你,你可以获取那个集合,循环遍历它(不管里面有什么)并将每个值分配到一个新数组中......即绑定。
【解决方案2】:

为了最好地帮助您决定如何处理表单,提供一些附加信息可能会有所帮助。

  • 某些东西正在决定生成此表单,这是做什么的?它的渲染依据是什么?

  • 是否存在可以解释的已知形式变化,或者元素是否真正相互独立?

  • 每个元素本身是否已知?如果是这样,是否可以给它们一个一致的 id/name,以便它们可以在服务器端被识别?

  • 当您谈到“处理”提交时,您希望实现的最终目标是什么?例如,您是否正在解析表单以存储在数据库中?

【讨论】:

  • 我有不同类型答案的问题列表,如文本框、复选框、单选按钮等。问题是表单集合的处理,因为它发送复选框项目和单个值的值列表其他人。
  • 问题列表总是不同的,所以我不能将它们命名为相同的......我给它们命名为“q”+ question_number
  • 我仍然不清楚并且相信可能会有所帮助的部分是在处理数据后知道您希望如何处理数据。具体来说,我试图确定您实际需要解析多少上下文知识。是否像遍历表单并逐字逐句获取答案并根据问题编号存储一样简单?
  • 是的,问题编号包含在表单键中,答案值是键的值。该问题是由具有多个答案的问题引起的,这些问题会生成字符串“4,5,8,9”或无法像其他答案一样处理的值列表。我不想硬编码它,因为我以后可以在不同的答案中使用它。
  • 您可能希望考虑在表单中放置一个隐藏字段,该字段具有众所周知的 id,其中包含您呈现的问题编号的分隔列表,其中包含值列表。当您构建问题时,此隐藏字段将在运行时动态填充。在服务器端,当您浏览提交的问题时,检查隐藏字段中包含的问题编号。如果那里存在问题编号,那么您就知道需要将其答案视为值列表并进行适当处理。
【解决方案3】:
foreach (var key in form.AllKeys) {
                    var answers = form.GetValues(key);

                    if (answers.Count() > 1){
                        foreach (var value in answers)
                        {
                            ...
                        }
                    }

                    else
                    {
                        ...
                    }
}

这很简单。我正在检查表单中的某些答案是否有多个值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-21
    • 1970-01-01
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多