首页 > 解决方案 > 在控制器中获取空值

问题描述

我在为事件传输值时遇到问题。我使用 fullcalendar 和 modal 来检索事件,然后通过 calendar.js 文件中的 sendAddEvent 函数(您可以看到下面的函数)将其进一步发送到 CalendarController ,其中除了将在表中输入的值之外的所有值参与者到达,尽管在 calendar.js 中的 sendAddEvent 函数中所有元素都有值,当他们到达 CalendarController 中的 AddEvent 函数时,有关参与者表的元素没有值。有谁知道是什么原因?谢谢你。

这是我在 calendar.js 中的函数和从表单中获取值的变量:

$('#eventModalSave').click(() => {
    const title = $('#EventTitle').val();
    const description = $('#Description').val();
    const startTime = moment($('#StartTime').val());
    const endTime = moment($('#EndTime').val());
    const color = ($('#Color').val());
    salaID = ($('#salaID').val());
    var roomID = parseInt(salaID);
    const UserId = ($('#ApplicationUserId').val());
    const isAllDay = $('#AllDay').is(":checked");
    const isNewEvent = $('#isNewEvent').val() === 'true' ? true : false;

    if (startTime > endTime) {
        alert('Ora de sfărșit a evenimentului nu poate fi mai mare decât ora de începere');

        return;
    } else if ((!startTime.isValid() || !endTime.isValid()) && !isAllDay) {
        alert('Vă rugăm să introduceți ora de început și sfărșit a evenimentului');

        return;
    }

    const event = {
        title,
        description,
        isAllDay,
        startTime: startTime._i,
        endTime: endTime._i,
        color,
        roomID,
    };
   
        
    

    if (isNewEvent) {
        sendAddEvent(event, UserId);
    } else {
        sendUpdateEvent(event, UserId);
    }
});

function sendAddEvent(event, UserId) {
    axios({
        method: 'post',
        url: '/Calendar/AddEvent',
        data: {
            "Title": event.title,
            "Description": event.description,
            "Start": event.startTime,
            "End": event.endTime,
            "AllDay": event.isAllDay,
            "color": event.color,
            salaID: event.roomID,
            "UserId": UserId,
        }
    })
        .then(res => {
            const { message, eventId } = res.data;

            if (message === '') {
                const newEvent = {
                    start: event.startTime,
                    end: event.endTime,
                    allDay: event.isAllDay,
                    title: event.title,
                    description: event.description,
                    color: event.color,
                    salaID: event.roomID,
                    UserId: UserId,
                    
                    eventId
                };

                $('#calendar').fullCalendar('renderEvent', newEvent);
                $('#calendar').fullCalendar('unselect');

                $('#eventModal').modal('hide');
            } else {
                alert(`Something went wrong: ${message}`);
            }
        })
        .catch(err => alert(`Something went wrong: ${err}`));
}

这是我的 CallendarController 中的 AddEvent 函数,其中 UserId 具有空值:

 [HttpPost]
        public IActionResult AddEvent([FromBody]Event evt, [FromBody]  Participants part)
        {
            string message = String.Empty;
            int eventId = 0;
            message = AddEvent(evt,part, out eventId);
            string AddEvent(Event evt,Participants part, out int eventId)
            {
                SqlConnection conn = GetConnection();
                SqlTransaction trans = conn.BeginTransaction();
                eventId = 0;
                var userIdlogged = User.FindFirstValue(ClaimTypes.NameIdentifier);
                try
                {
                    SqlCommand cmd = new SqlCommand(@"Insert into[Participants]
                                                    (UserId
                                                    ,EventId)
                                                   values
                                                    (@UserId
                                                     ,@eventid);
                                                 insert into [Events]
                                                (
                                                    title
                                                    ,[description]
                                                    ,event_start
                                                    ,event_end
                                                    ,all_day
                                                    ,color
                                                    ,salaID
                                                    ,ApplicationUserId
                                                )
                                                values
                                                (
                                                    @title
                                                    ,@description
                                                    ,@start
                                                    ,@end
                                                    ,@allDay
                                                    ,@color
                                                    ,@salaID
                                                    ,@ApplicationUserID
                                                );
                                                select scope_identity()", conn, trans)
                    {
                        CommandType = CommandType.Text
                    };
                    cmd.Parameters.Add("@title", SqlDbType.VarChar).Value = evt.Title;
                    cmd.Parameters.Add("@description", SqlDbType.VarChar).Value = evt.Description;
                    cmd.Parameters.Add("@start", SqlDbType.DateTime).Value = evt.Start;
                    cmd.Parameters.Add("@end", SqlDbType.DateTime).Value = Helpers.ToDBNullOrDefault(evt.End);
                    cmd.Parameters.Add("@allDay", SqlDbType.Bit).Value = evt.AllDay;
                    cmd.Parameters.Add("@color", SqlDbType.VarChar).Value = evt.color;
                    cmd.Parameters.Add("@salaID", SqlDbType.Int).Value = evt.salaID;
                    cmd.Parameters.Add("@ApplicationUserId", SqlDbType.VarChar).Value = userIdlogged;
                    cmd.Parameters.Add("@UserId",SqlDbType.VarChar).Value=part.UserId;
                    cmd.Parameters.Add("@eventid", SqlDbType.Int).Value =eventId;
                    eventId = Convert.ToInt32(cmd.ExecuteScalar());
                    trans.Commit();
                }
                catch (Exception exp)
                {
                    trans.Rollback();
                    message = exp.Message;
                }
                finally
                {
                    CloseConnection(conn);
                }
                return message;
            }
            return Json(new { message, eventId });

标签: jqueryasp.net-mvcasp.net-core

解决方案


使用 [FromBody] 属性时,您只能将一个值(简单或复杂类型)作为参数传递给 Web API 控制器方法。

这是一个演示如何将数据传递给控制器​​的工作演示。

控制器(测试控制器):

    [HttpGet]
    public IActionResult AddEvent()
    {
        return View();
    }
    [HttpPost]
    public IActionResult AddEvent(Event e,Participants p)
    {
        return View();
    }

查看(添加事件):

@{
    ViewData["Title"] = "AddEvent";
}

<h1>AddEvent</h1>
<button onclick="AddEvent()">AddEvent</button>
@section scripts{ 
    <script type="text/javascript">

        function AddEvent() {
            var event = {};
            event.Title = "Title";
            event.Description = "Description";
            event.AllDay = "AllDay";
            event.Color = "Color";
            event.SalaID = "SalaID";
            var participants = {};
            participants.UserId = "UserId";
            participants.UserName = "UserName";
            $.ajax({
                type: "POST",
                url: "/Tests/AddEvent",
                contentType: "application/x-www-form-urlencoded",
                data: { e: event, p: participants}
            })
        }
  
    </script>
}

事件:

public class Event
    {
        public string Title { get; set; }
        public string Description { get; set; }
        public string AllDay { get; set; }
        public string Color { get; set; }
        public string SalaID { get; set; }
    }

参与者:

public class Participants
    {
        public string UserId { get; set; }
        public string UserName { get; set; }
    }

结果: 在此处输入图像描述


推荐阅读