【问题标题】:Modal popup error: "The parameters dictionary contains a null entry for parameter 'id' of non-nullable type模态弹出错误:“参数字典包含不可为空类型的参数 'id' 的空条目
【发布时间】:2017-03-08 01:03:39
【问题描述】:

我正在尝试通过模式弹出窗口中的ActionLink 进行 AJAX Get 调用以查看每个学生的详细信息。弹出窗口出现,但不显示模态框的主体。

在控制台中,我收到此错误消息,

“参数字典包含“ContosoUniversity.Controllers”中方法“System.Web.Mvc.ViewResult Details(Int32)”的不可空类型“System.Int32”的参数“id”的空条目。 StudentController'。可选参数必须是引用类型、可空类型或声明为可选参数。 参数名称:参数”

我对这个错误消息的含义感到困惑。

详情 ActionLink

@Html.ActionLink("Details", "Details", null, new { id = item.ID, @class = "modalDetails" }) 

我的模态

<div class="modal fade" id="myModal">
    <div class="modal-dialog">
        <div class="modal-content">

            <div class="modal-header">
                <a href="#" class="close" data-dismiss="modal">&times;</a>
                <h3 class="modal-title">Student Details</h3>
            </div>

            <div class="modal-body">

            </div>

            <div class="modal-footer">
                <a href="#" class="btn btn-default" data-dismiss="modal">Cancel</a>

            </div>
        </div>
    </div>
</div>

AJAX 调用

<script type="text/javascript">
    $(function () {
        $(".modalDetails").click(function (e) {

            e.preventDefault();

            var id = $(this).data('id');
            //console.log('the id is: ' + id);

            var loadModal = function () {

                //var deferred = $.Deferred();//create a deffered object

                var url = "/Student/Details";

                $.get(url, { id: id }, function (data) {

                    $('.modal-body').html($(data).find('#details'));
                });

                //return deferred.promise();
            };

            loadModal();

            //loadModal().done(function () {
            //console.log("done loading modal!");
            $('#myModal').modal('show');// show the modal pop up
            // });

        });
    });
</script>

StudentController

// GET: /Student/Details/5

        public ViewResult Details(int id)
        {
            Student student = studentRepository.GetStudentByID(id);
            return View(student);
        }

【问题讨论】:

  • 控制器操作方法需要id 参数,但视图代码不提供它。检查item.ID 值是否为空值。

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


【解决方案1】:

您尚未添加名为iddata- 属性(您刚刚添加了id 属性)。

生成链接的代码需要是

@Html.ActionLink("Details", "Details", null, new { data_id = item.ID, @class = "modalDetails" })

或者,您可以构建完整的网址

@Html.ActionLink("Details", "Details", "Student", new { id = item.ID}, new { @class = "modalDetails" })

然后在脚本中使用

var url = $(this).attr('href'); // outputs "/Student/Details/2" assuming item.ID = 2;
$.get(url, function (data) {
    ....
});

【讨论】:

  • 不,不是——可能只是$(".modalDetails").click(function (e) { e.preventDefault(); $.get(url, function (data) { $('.modal-body').html($(data).find('#details')); $('#myModal').modal('show'); }); })
  • 但有点不清楚为什么要返回一个您只想使用其中一部分的视图 - 为什么不只返回一个仅包含 #details 位的部分视图?
  • 基本步骤应该是(1)创建一个带有表单的局部视图,用于在视图中编辑Student(2),使用@Html.Partial()在视图(3)中渲染它.click()处理程序,调用返回所选Student的json的方法并更新相应的表单控件并显示模型。
  • 对于提交,处理表单.submit()事件,检查.isValid()(如果没有取消),然后序列化表单并发送到POST方法。主要问题是如何处理 ModelState 无效,但这本身就是一个大主题。
  • @Truecolor,典型例子参考this answer
猜你喜欢
  • 1970-01-01
  • 2012-07-26
  • 1970-01-01
  • 2012-10-06
  • 1970-01-01
  • 2018-05-30
  • 2013-04-11
  • 1970-01-01
相关资源
最近更新 更多