如何将数组从视图传递到控制器?

时间:2017-10-24 03:23:02

标签: c# json ajax asp.net-mvc

抱歉,我知道这可能是一个重复的问题。 我已经创建了这些信息但实际上并不知道如何做到这一点。

我想将数组从视图传递给控制器​​。以下是代码

@using (Html.BeginForm("FinishExam", "Exams"))
{
    @Html.AntiForgeryToken()

    List<int> answerArray = new List<int>();

    for (var i = 0; i <= examMulQuestion.Count - 1; i = i + 3)
    {
        int questionId = examMulQuestion[i].questionId;

            <h4> @questionNo . @examMulQuestion[i].questionContent</h4>
        questionNo++;

            <li style="">
                <input type="radio" name="answerArray[@answerNo]" value="@examMulQuestion[i].answerId">       @examMulQuestion[i].answerContent <br />
                <input type="radio" name="answerArray[@answerNo]" value="@examMulQuestion[i + 1].answerId"> @examMulQuestion[i + 1].answerContent <br />
                <input type="radio" name="answerArray[@answerNo]" value="@examMulQuestion[i + 2].answerId"> @examMulQuestion[i + 2].answerContent
            </li>
        answerNo++;
        <br /><br />
    }
}

<input id="submitButton" type="submit" value="submit" class="btn btn-default">

我使用answerArray[@answerNo]作为数组,例如answerArray[0]answerArray[1]等,我不知道如何将数组传递给控制器​​,因为当按钮提交时controller显示数组为null

public ActionResult FinishExam(List<int> answerArray) (shows null)
{
    return View();
}

我尝试使用ajax,但我是初学者,不知道该怎么做。

function submit() {
    $.ajax({
        url: ('/Exams/FinishExam'),
        type: 'POST',
        data: answerArray,
        dataType: 'JSON'
    });
}
你会告诉我的方式吗?十分感谢!!

3 个答案:

答案 0 :(得分:0)

我认为这会满足你的条件。请检查一下。

                         var id=new Array();
                          $.each($(".listCheckBox"), function(i){   

                              if($(this).prop('checked')==true){

                                  var splitid = $(this).val();
                                  var splittedid = splitid.split('~-1~-1`');
                                 id.push(splittedid[0]);

                              }
                         }); 

答案 1 :(得分:0)

问题是answerArray只能在服务器的后端代码中访问。您无法从JavaScript访问它。如果您使用调试器(Chrome调试器或其他Web调试器),您会注意到未定义answerArray。这是您实现所需目标的一种方式。在您的视图中添加以下代码:

<script>
    var answerArray = 
        @Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(answerArray));
</script>

现在它将序列化c#变量answerArray并将其分配给名为answerArray的JavaScript变量。然后,您可以在JavaScript中使用它。

答案 2 :(得分:0)

这是我的建议。

首先为此页面视图创建模型或视图模型:

public class ExamModel
{

    public virtual string questionContent { get; set; }

    public virtual int questionId { get; set; }

    public virtual int answerId { get; set; }

    public virtual string answerContent { get; set; }
}

然后在渲染视图之前填充它:

 public ActionResult Index()
    {
        IList<ExamModel> lstModel = new List<ExamModel>();
        lstModel.Add(new ExamModel()
        {
            questionContent = "Test Question1",
            questionId = 1,
            answerId = 101,
            answerContent = "Answer Test101"
        });
        lstModel.Add(new ExamModel()
        {
            questionContent = "Test Question2",
            questionId = 2,
            answerId = 102,
            answerContent = "Answer Test102"
        });

        return View(lstModel);
    }

使用以下方法将其传递到剃须刀视图:

@model IList<SPiGlobal.PR.Web.Models.ExamModel>

然后在你的for循环中:

@using (Html.BeginForm("FinishExam", "SO"))
{
@Html.AntiForgeryToken()

for (var i = 0; i <= Model.Count - 1; i++){
    <div class="editor-label">
        @Model[i].questionContent
    </div>

    <div class="editor-field">
      @Html.RadioButtonFor(model => model[i].answerId, Model[i].answerId, true) @examMulQuestion[i].answerContent  
    </div>
   }
<input id="submitButton" type="submit" value="submit" class="btn btn-default">
}

注意确保你的提交按钮在你的BeginForm中,因为当它在BeginForm之外时它对我不起作用:

<input id="submitButton" type="submit" value="submit" class="btn btn-default">

这只是一个建议,这是PostBack的截图:

enter image description here