【问题标题】:MVC - My form is not passing my select dropdown's selected optionMVC - 我的表单没有通过我的选择下拉列表的选择选项
【发布时间】:2020-03-18 01:45:45
【问题描述】:

我正在尝试使用 ajax 帖子将我的下拉值发布到我的控制器。除了我的下拉选择列表之外,所有表单值都可以正常传递。当我使用浏览器的 devtools 查看 select 元素时,它的名称为 SortByList

型号

public IList<SortBy> SortByList { get; set; }

public class SortBy
{
    public string Text { get; set; }
    public bool Selected { get; set; }
}

查看下拉列表

@using (Html.BeginForm("FDCLSubmit", "Reports", FormMethod.Post, new { id = 
"reportForm", @class = "report-form col-9" }))
{
<div class="row">
    <b class="col-2" style="padding-top: 5px;">Sort By</b>
    <select asp-for="SortByList" class="form-control col-3">
        @for (var x = 0; x < Model.SortByList.Count; x++)
        {
            <option value="@Model.SortByList[x].Text">@Model.SortByList[x].Text</option>
        }
    </select>
</div>
(saveSubmit button partial view here)
}

Ajax 帖子

$('#saveSubmit').on('click', function (evt) {
    var report = $('form').serialize();
    var form = new Object();
    form.report = report;
    form.EnteredCriteriaName = $('#EnteredCriteriaName').val();

    //Ajax form post
    $.ajax({
        type: 'POST',
        data: form.report,
        contentType: dataType,
        url: '@Url.Action("FDCLCheckIfExists", "Reports")',
        success: function (data) {
            if (data.exists == true) {
                //Toggle the error modal and display messages
                $('#existsModal').modal('toggle');
                $('#modalYes').on('click', function () {
                    //User selected to replace report criteria
                    $.ajax({
                        type: 'POST',
                        data: form.report,
                        contentType: dataType,
                        url: '@Url.Action("SaveFDCLCriteria", "Reports")',
                        success: function (data) {
                            console.log(data);
                            if (data.success) {
                                window.location.href = data.url;
                            } else {
                                //Toggle the error modal and display messages
                                $('#errorsModal').modal('toggle');
                                //Add <br> tags when there is a linebreak in the string.  This will add the line breaks into the HTML.
                                $('#errorsModal .modal-body p').html(data.message.replace(/(?:\r\n|\r|\n)/g, '<br>'));
                            }
                        }
                    });
                });
            }
        }
    });
});

控制器

我在这个控制器中设置了断点,这就是我的reportSortByList 属性出现为空的地方。

public ActionResult FDCLCheckIfExists(FirstDollarCreditListing report, string EnteredCriteriaName)
{
    var criteria = report.ConvertToCriteria(report);
    criteria.CriteriaName = EnteredCriteriaName;
    var rep = new ReportFirstDollarCreditListing();
    var exists = rep.DoesCriteriaNameAlreadyExist(criteria);
    return Json(new { exists = exists });
}

【问题讨论】:

  • 你应该在cshtml文件中发布所有表格
  • html 中的表单元素在哪里?找不到它,也无法知道您从 jquery 检索的内容是否是您应该发送的内容
  • 我避免发布整个表单,因为它很长,但我已在表单创建助手中添加。

标签: javascript c# ajax asp.net-mvc asp.net-core


【解决方案1】:

首先你需要知道当你使用$('form').serialize()时它会传递如下数据:

SortByList=aaa

但是模型中的 SortByList 是一个列表,它需要如下数据:

SortByList[0]=aaa

这是一个工作演示:

1.Model(需要添加一个属性来接收选中的项):

public class FirstDollarCreditListing
{
    public string SelectedSort { get; set; }
    public IList<SortBy> SortByList { get; set; }
}

2.查看:

注意:当您使用.serialize() 时,它会生成“查询字符串”格式的数据,需要使用默认的contentType application/x-www-form-urlencoded; charset=UTF-8 发送,而不是JSON。

@model FirstDollarCreditListing
<form>
    <div class="row">
        <b class="col-2" style="padding-top: 5px;">Sort By</b>
        <select asp-for="SelectedSort" class="form-control col-3">
            @for (var x = 0; x < Model.SortByList.Count; x++)
            {
                <option value="@Model.SortByList[x].Text">@Model.SortByList[x].Text</option>
            }
        </select>        
    </div>
    <div>
        <input id="saveSubmit" type="button" value=" submit" />
    </div>
</form>
<input id="EnteredCriteriaName" value="asd" />
@section Scripts
{
<script>
    $('#saveSubmit').on('click', function (evt) {
        var report = $('form').serialize();

        var EnteredCriteriaName = $('#EnteredCriteriaName').val();

        //Ajax form post
        $.ajax({
            type: 'POST',
            contentType: "application/x-www-form-urlencoded; charset=UTF-8",
            data:report+"&EnteredCriteriaName="+EnteredCriteriaName,
            url: '@Url.Action("FDCLCheckIfExists", "Home")',
            success: function (data) {
                 //..
            }
    });
});
</script>
}

3.控制器:

[HttpPost]
public void FDCLCheckIfExists(FirstDollarCreditListing report, string EnteredCriteriaName)
{
    //...   
}

结果:

【讨论】:

  • 一个非常详细的答案。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多