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

时间:2014-09-04 19:02:22

标签: asp.net-mvc forms asp.net-mvc-5 asp.net-mvc-viewmodel

我一直在这里寻找类似的问题,但仍无法找到问题的解决方案。

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

public class MyViewModel
 {
   public IEnumerable<WordingB> WordingBs { get; set; }
   public IEnumerable<WordingC> WordingCs { get; set; }
   public IEnumerable<Question> Questions { get; set; } 
}

这里有关于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;}
    }

这是有问题的页面:

@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>

}

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

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

            viewModel.Questions = // first query

            viewModel.WordingBs = // second query

            viewModel.WordingCs = // third query

            return View(viewModel);
        }

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

3 个答案:

答案 0 :(得分:6)

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

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

<input type="text" name="Answer">

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

public ActionResult Routing(List<string> Answer){} 

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

<label for="Answer">@question.QuestionText</label>
<input type="hidden" name="QuestionText" value=@question.QuestionText />

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

public ActionResult Routing(List<string> Answer, List<string> QuestionText){} 

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

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

答案 1 :(得分:1)

您应该做的是创建一个回发方法,该方法绑定到视图中的ViewModel,以便MVC框架为您返回模型数据。

方法看起来像这样

[Post]
public ActionResult EOW(MyViewModel viewModel)
    {
       //Do something  
        return View();
    }

答案 2 :(得分:0)

首先使用Html助手

@{int i = 0;}
@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[i]">
                </div>
i++;
            }

和viewmodel

public class Question
{           
    public string QuestionText { get; set; }
    public IEnumerable<string> Answer {get; set;}
}

阅读本教程

1 2 3