从具有可变输入数量的Form传递数据 - MVC 5

Oua*_*ixi 0 forms asp.net-mvc asp.net-mvc-viewmodel asp.net-mvc-5

我一直在这里寻找类似的问题,但仍然找不到我的问题的解决方案.

我有一个包含一些文本和表单的页面,它们共享相同的ViewModel,如下所示:

public class MyViewModel
 {
   public IEnumerable<WordingB> WordingBs { get; set; }
   public IEnumerable<WordingC> WordingCs { get; set; }
   public IEnumerable<Question> Questions { get; set; } 
}
Run Code Online (Sandbox Code Playgroud)

这里有关于WordingB,WordingC和Question的更多细节:

public class WordingB
    {           
        public string EOW { get; set; }
    }



public class WordingC
    {           
        public string EOW { get; set; }
    }




public class Question
    {           
        public string QuestionText { get; set; }
        public string Answer {get; set;}
    }
Run Code Online (Sandbox Code Playgroud)

这是有问题的页面:

@model MyProject.ViewModels.MyViewModel   

<div class="col-md-6 masonry listview-block">
    @foreach (var wording in Model.WordingBs)
    {
        <div class="block">                
            <p>@Html.Raw(@wording.EOW)</p>
        </div>
    }
    @foreach (var wording in Model.WordingCs)
    {
        <div class="block">              
            <p>@Html.Raw(@wording.EOW)</p>
        </div>
    }

</div>


@using (Ajax.BeginForm("Routing", "Partials", new AjaxOptions { UpdateTargetId = "Target", LoadingElementId = "spinner", HttpMethod = "POST", InsertionMode = InsertionMode.Replace }))
{


            <div id="quick-post" class="block-body form-validation">
                @foreach (var question in Model.Questions)
                {
                    <div class="form-group">
                        <label for="QuestionText">@question.QuestionText</label>
                        <input type="text" class="form-control input-sm input-sm" name="Answer">
                    </div>
                }
                <div class="form-group">
                    <label for="postcode">PostCode</label>
                    <input type="text" class="form-control input-sm validate[required] input-sm" name="postcode" value=@Request.QueryString["postcode"]>

                </div>

                <div class="form-group">
                    <label>Loss Description</label>
                    <textarea></textarea>
                </div>

                <input type="submit" class="btn btn-primary btn-xs" value="Route">

            </div>

        </div>
    </div>

}
Run Code Online (Sandbox Code Playgroud)

这个想法是一些管理员能够向表单添加问题.(问题存储在表中)有一个控制器使用MyViewModel并将我需要的模型返回给视图.

 public ActionResult EOW()
        {
            QuestionsandWording viewModel = new QuestionsandWording();

            viewModel.Questions = // first query

            viewModel.WordingBs = // second query

            viewModel.WordingCs = // third query

            return View(viewModel);
        }
Run Code Online (Sandbox Code Playgroud)

我现在面临的问题是将数据从我的表单传递给控制器​​.就我而言,表格可以有0到30或40个问题!我觉得我已达到了我的知识极限,而且我非常需要建议.

Oua*_*ixi 6

在cosset和Derek的帮助下,我设法找到了一个解决方法如下:

1)我给我的输入元素命名如下:

<input type="text" name="Answer">
Run Code Online (Sandbox Code Playgroud)

我不需要按照其中一个答案的建议迭代Answer [i],因为框架会自动将所有具有相同名称的输入绑定到我的方法可以作为参数的List元素中.像这样:

public ActionResult Routing(List<string> Answer){} 
Run Code Online (Sandbox Code Playgroud)

2)我还需要在我的路由方法中使用我的标签标签的值,并且不知道如何做到这一点.同样,Cosset建议我使用隐藏字段并给它一个标签文本的值.这非常有效.

<label for="Answer">@question.QuestionText</label>
<input type="hidden" name="QuestionText" value=@question.QuestionText />
Run Code Online (Sandbox Code Playgroud)

现在这个方法看起来像这样:

public ActionResult Routing(List<string> Answer, List<string> QuestionText){} 
Run Code Online (Sandbox Code Playgroud)

现在我得到了我需要的东西.将所有数据从我的表单传递到控制器(标签和输入),而不必担心MyViewModel.

为了学习,我很想知道是否还有其他方法可以实现这一点.