首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Json post到asp.net核心剃须刀页面模型返回空

Json post到asp.net核心剃须刀页面模型返回空
EN

Stack Overflow用户
提问于 2020-10-22 03:14:50
回答 1查看 321关注 0票数 0

尝试了大量的解决方案,并在网上修复,但没有进展,做了调查研究,我需要你们的帮助,伙计们。

这是我的Js脚本,用于将学生成绩推送到页面模型,当我检查学生成绩时,它有值。

代码语言:javascript
运行
复制
<script>
if (btnTakeScore) {
    btnTakeScore.onclick = function (e) {
        e.preventDefault();

        var rows = document.querySelectorAll('tbody tr');
        let studentScores = [];
        for (let i = 0; i < rows.length; i++) {
            let studentId = rows[i].getAttribute('studentId');

            studentScores.push({
                studentId: studentId,
                sessionId: cboSession.value,
                termId: cboTerms.value,
                classId: cboClass.value,
                subjectScores: []
            })

            let tds = rows[i].querySelectorAll('td input[type="number"]');
            for (let j = 0; j < tds.length; j++) {

                // Simulate missing score instead of a 0;
                let ctrl = tds[j];
                if (ctrl.value !== '') {

                    studentScores[i].subjectScores.push({
                        studentId: studentId,
                        subjectId: tds[j].getAttribute('subjectId'),
                        score: ctrl.value,
                        scoreTypeId: cboScoreType.value
                    });
                }
            }
        }

        // call server here to post the data
        //const serverUrl = 'https://localhost:44301/api/SaveStudentScores';
        const serverUrl = '@Url.Page("/Teacher/StudentScore")?handler=SaveScore';
        let r = new XMLHttpRequest();
        r.open('post', serverUrl);
        r.setRequestHeader('content-Type', 'application/json');
        r.setRequestHeader("XSRF-TOKEN",
                        $('input:hidden[name="__RequestVerificationToken"]').val());
        r.send(JSON.stringify(studentScores));
        r.onload = function () {
            if (r.status === 200) {
                var res = JSON.parse(this.responseText);
                if (res.status === true) {
                    alert(res.message);

                    // clear the fields.
                    var inputs = document.querySelectorAll('table#scoreEntry input[type="number"]');
                    inputs.forEach(d => d.value = '0'); // reset the scores to Zero

                }
            }
        }
    }
}
<script>

这是我的PageModel OnPost。当它来到这里时,分数值变为空。

代码语言:javascript
运行
复制
public async Task<JsonResult> OnPostSaveScore([FromBody]IEnumerable<StudentScoreContainer> scores)
    {
        
        try
        {
            // Code to push date to the database 
            }

            return new JsonResult(new { status = true, messsage = "Student(s) score saved!" });
        }
        catch (Exception ex)
        {
            return new JsonResult(new { status = false, message = ex.Message });
        }

    }


 public struct StudentScoreContainer
{
    public int studentId { get; set; }
    public int classId { get; set; }
    public int sessionId { get; set; }
    public int termId { get; set; }
    public int scoreTypeId { get; set; }
    public IEnumerable<SubjectScoreContainer> subjectScores { get; set; }

}


public struct SubjectScoreContainer
{
    public int studentId { get; set; }
    public int subjectId { get; set; }
    public int score { get; set; }
}

这是我的Html代码

代码语言:javascript
运行
复制
<div class="card-body">
                <div class="row">
                    <div class="col-sm-2">
                        <div class="form-group">
                            <label>Class Room<span class="text-danger">* 
                           </span></label>
                            <select id="classRoom" class="select" form="searchForm" required="required" asp-items="@(new SelectList(Model.Classess, "Class.Id","Class.Name"))">
                                <option value="">Select ClassRoom</option>
                            </select>
                        </div>
                    </div>
                    <div class="col-sm-2">
                        <div class="form-group">
                            <label>Session<span class="text-danger">*</span></label>
                            <select id="session" class="select" required="required" asp-items="@(new SelectList(Model.Sessions, "Id","Name"))">
                                <option value="">Select Session</option>
                            </select>
                        </div>
                    </div>
                    <div class="col-sm-2">
                        <div class="form-group">
                            <label>Term<span class="text-danger">*</span></label>
                            <select id="term" class="select" required="required" asp-items="@(new SelectList(Model.Terms, "Id","Name"))">
                                <option value="">Select Term</option>
                            </select>
                        </div>
                    </div>
                    <div class="col-sm-2">
                        <div class="form-group">
                            <label>Score Types<span class="text-danger">*</span></label>
                            <select id="cboScoreType" class="select" required="required" asp-items="@(new SelectList(Model.ScoreTypes, "Id","Name"))">
                                <option value="">Select ScoreType</option>
                            </select>
                        </div>
                    </div>
                    <div class="col-md-3">
                        <label></label>
                        <p></p>
                        <button id="btnSearch" type="submit" class="btn btn-success btn-block"> Search </button>
                    </div>
                </div>
                <div class="row">
                    <div class="col-lg-12">
                        <div class="table-responsive">
                           
                            <table class="table table-striped custom-table table-nowrap mb-0" id="studentList">
                                <thead>
                                    <tr>
                                        <th>Student</th>
                                        @foreach (var s in Model.SubjectsByTeacher)
                                        {
                                            <th style="text-align:center">@s.Subject.Name</th>
                                        }
                                    </tr>
                                </thead>
                                <tbody>
                                    @foreach (var student in Model.Students)
                                    {
                                        <tr studentId="@student.StudentID">
                                            <td>@(student.FirstName.Trim() + " " + student.LastName.Trim())</td>
                                            @foreach (var subject in Model.SubjectsByTeacher)
                                            {
                                                <td style="text-align:center"><input type="number" min="0" max="100" class="form-control" studentId="@student.StudentID" subjectId="@subject.Subject.Id" /></td>
                                            }
                                        </tr>
                                    }
                                </tbody>
                            </table>
                            
                            <br />
                        </div>
                    </div>
                    <div>
                    </div>
                </div>
                <div class="row">
                    <div class="col-md-12">
                        <div class="form-group">
                            <button id="btnTakeScore" class="btn btn-primary">
                                <i class="fa fa-pen"></i> &nbsp; <b>Take Scores</b>
                            </button>
                        </div>
                    </div>
                </div>

            </div>

我非常感谢你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-23 10:44:20

根据js和剃刀页面代码,我发现您直接读取getAttribute值并将其发布到页面方法中。

因为studentId和其他属性都是int类型,但是从html代码中得到的值是字符串。这就是为什么页面模型不能很好地绑定值的原因。

我建议您可以在js中将rows[i].getAttribute('studentId')转换为int。

如下所示:

因为我没有完整的js代码和pagemodel类,所以我只创建一个测试js模型来测试它。

您可以尝试按照下面的代码替换您所拥有的js代码。

studentScores:

代码语言:javascript
运行
复制
studentScores.push({
    studentId: +studentId,
    sessionId: +cboSession.value,
    termId: +cboTerms.value,
    classId: +cboClass.value,
    subjectScores: []
})

subjectScores:

代码语言:javascript
运行
复制
                studentScores[i].subjectScores.push({
                    studentId: +studentId,
                    subjectId: +tds[j].getAttribute('subjectId'),
                    score: +ctrl.value,
                    scoreTypeId: +cboScoreType.value
                });

作为@Joseph的评论,我们也可以使用NewtonsoftJson而不是System.Text.Json来报道这个问题。

更多细节,请参阅以下代码:

从url下面安装Microsoft.AspNetCore.Mvc.NewtonsoftJson:

https://www.nuget.org/packages/Microsoft.AspNetCore.Mvc.NewtonsoftJson

将以下代码添加到startup.cs配置服务方法中:

代码语言:javascript
运行
复制
        services.AddRazorPages().AddNewtonsoftJson();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64474750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档