【问题标题】:How to repeat form controls in asp.net mvc and pass them as a list to controller如何在asp.net mvc中重复表单控件并将它们作为列表传递给控制器
【发布时间】:2016-03-17 18:13:43
【问题描述】:

我在一个视图表单中有 3 个控件(一个文本框、一个数字框和一个日期),这 3 个构成了模型对象。有提供给用户的链接,单击此链接时,所有 3 个控件在表单内重复 5 次。

我有一个模型类列表作为控制器操作方法中的参数类型。如何克隆表单内容 5 次以使其正确序列化到列表?

【问题讨论】:

  • 在 Razor 视图中使用带有计数器的 @for() 循环。向我们展示您的尝试。
  • 参考答案 herehere 以获得一些选项

标签: javascript c# jquery .net asp.net-mvc


【解决方案1】:

当用户单击“添加”按钮时,您应该使用 jQuery 动态创建包含所有 3 个输入字段的行。

因此,在您的 razor 视图(例如:Create)中,使用三个表单字段创建第一行。

@using (Html.BeginForm())
{
   <a href="#" id="addRow">Add</a>
   <div id="items">
      <div class="itemRow">
         <label>Name</label> <input type="text" class="formfield" name="Name" />
         <label>Age</label>  <input type="text" class="formfield" name="Age" />
         <label>CreateDate</label><input type="text" class="formfield" name="CreateDate" />
      </div>
   </div>
    <input type="submit" id="btnSubmit" />
}

现在我们将添加一些客户端代码来监听 Add 链接上的 click 事件,创建容器 div 的克隆(带有 css 类 itemRow)并将其附加到外部容器 div(带有 id items)。当用户单击提交按钮时,我们将读取表单字段并构建一个对象数组并使用 jQuery ajax 将其发布到服务器。

@section Scripts
{
<script type="text/javascript">

    $(function () {

        $("#addRow").click(function (e) {
            e.preventDefault();    
            var template = $("#items").find(".itemRow").first();
            var newRow = template.clone();
            newRow.find("input.formfield").val("");
            $("#items").append(newRow);

        });

        $("#btnSubmit").click(function (e) {
            e.preventDefault();
            var _this = $(this);
            var url =_this.closest("form").attr("action");

            var rows = [];
            var items = $(".itemRow");

            $.each(items, function (i, item) {                   
                var name =  $(item).find("input[name='Name']").val();
                var age =  $(item).find("input[name='Age']").val();
                var createDt =  $(item).find("input[name='CreateDate']").val();

                var row = { Name: name, Age: age, CreateDate: createDt };
                rows.push(row);    
            });

            //Let's post to server
            $.ajax({
                type:"POST",
                url: url,
                data: JSON.stringify(rows),
                contentType: "application/json"                       
            })
            .done(function (result) {
                //do something with the result
            })                 

        });    
    });    
</script>
}

现在您需要一个 HttpPost 操作方法来处理您的表单发布。

[HttpPost]
public ActionResult Create(IEnumerable<CreateUser> model)
{
    foreach(var item in model)
    {
        // to do  :Save
    }
    return Json( new { status ="success"});
}

你的 CreateUser 视图模型看起来像

public class CreateUser
{
    public string Name { set;get;}
    public int Age { set; get; }
    public DateTime CreateDate { set; get; }
}

【讨论】:

  • 非常感谢您的回答
【解决方案2】:

更简单的方法。

型号:

public class MyModel
{
    public IList<OneSetOfElements> FormSet { get; set; }
}

public class OneSetOfElements
{
    public string Name { get; set; }
    public int Age { get; set; }

    [DataType(DataType.Date)]
    public DateTime Dob { get; set; }
}

行动:

public ActionResult MyAction(MyModel model)
{
    foreach (var set in model.FormSet)
    {
        //read your data.
    }
}

查看:点击时显示 id“showMeOnUrlClick”

    @using (Html.BeginForm())
    {

//This would bind as first list element
        <div id="firstSet"> 
            @Html.EditorFor(m => m.FormSet[1].Name)
            @Html.EditorFor(m => m.FormSet[1].Age)
            @Html.EditorFor(m => m.FormSet[1].Dob, new { type = "date" })

        </div>

//Remaining list element
        <div id="showMeOnUrlClick" style="display: none"> 
            @for (int i = 1; i <= 6; i++)
            {
                @Html.EditorFor(m => m.FormSet[i].Name)
                @Html.EditorFor(m => m.FormSet[i].Age)
                @Html.EditorFor(m => m.FormSet[i].Dob, new {type = "date"})
            }
        </div>

        <button onclick="showTheRepeatedFields() ">Show</button>
    }

【讨论】:

  • 谢谢@Shishir Kushwaha
猜你喜欢
  • 1970-01-01
  • 2016-10-13
  • 2014-10-17
  • 2012-05-19
  • 1970-01-01
  • 2020-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多