Really have no idea on Jumping... Could anyone help

I want to perform a jump in my game, I’ll give my code first…

Here is a Gravity Code:
MoveVector is the Direction and Speed my Char moves:

    void ApplyGravity()
{
if (MoveVector.y > -100f)
{
MoveVector = new Vector3(MoveVector.x,
MoveVector.y - Gravity * Time.deltaTime,
MoveVector.z);
}
if (CharController.isGrounded && MoveVector.y > -1)
{
MoveVector = new Vector3(MoveVector.x,
-1,
MoveVector.z);
}
if (!CharController.isGrounded)
{
animation.CrossFade("fall");
}
}

Here is my Jump Code

void Jump()
{
if (Input.GetButtonDown("Jump"))
{
if (CharController.isGrounded)
{
Debug.Log("Should Jump Now");
MoveVector = new Vector3(MoveVector.x, MoveVector.y + JumpSpeed, MoveVector.z);
}
}
}

now the problem is…
if I press the Space Button, my Char just disappear on the ground and show up in the mid-air falling…that is not jumping…I see my gravity function works fine though, still I don’t know how to jump to the mid-air smoothly. Could anyone help, please…?

Thanks a lot!

EDITED: MoveVector is the direction and speed of my Character’s movement.

the code I use to move my character:

the M_Motor class:

using UnityEngine;
using System.Collections;

public class M_Motor : MonoBehaviour
{
    #region Fields

    public static M_Motor Instance;

    public float PlayerSpeed = 1f;
    public float VelCharY = 0.1f;
    public float CharYSmooth = 0.5f;
    public float Gravity = 2.8f;
    public float JumpSpeed = 0.7f;
    public float TerminalVelocity = 100f;

    public Vector3 MoveVector;

    #endregion

    #region Function

    void Awake()
    {
        Instance = this;
    }

    public void UpdateMotion()
    {

        ProcessMotion();
    }

    void ProcessMotion()
    {
        if (MoveVector.magnitude > 1)
            MoveVector = Vector3.Normalize(MoveVector);

        ApplyGravity();

        MoveVector *= PlayerSpeed;

        M_Controller.CharController.Move(MoveVector *Time.deltaTime);

    }

    void ApplyGravity()
    {
            MoveVector = new Vector3(MoveVector.x,
                                     MoveVector.y - Gravity,
                                     MoveVector.z);
        if (!M_Controller.CharController.isGrounded)
        {
            animation.CrossFade("fall");
        }
    }

    public void Jump()
    {
        MoveVector.y = JumpSpeed;
    }
    #endregion
}

and the M_Controller Class:

using UnityEngine;
using System.Collections;

public class M_Controller : MonoBehaviour
{
    #region Fields

    public static M_Controller Instance;
    public static CharacterController CharController;

    #endregion

    #region Function

    void Awake()
    {
        CharController = GetComponent("CharacterController") as CharacterController;
        Instance = this;
    }

    void Update()
    {
        if (Camera.mainCamera == null)
            return;

        RecievePlayerInput();
        RecievePlayerJumpInput();
        M_Motor.Instance.UpdateMotion();

    }

    void RecievePlayerInput()
    {
        var deadZone = 0.1f;

        M_Motor.Instance.MoveVector = Vector3.zero;

        animation.CrossFade("idle");

        if (Input.GetAxis("Horizontal") > deadZone || Input.GetAxis("Horizontal") < -deadZone)
        {
            animation.CrossFade("run");
            M_Motor.Instance.MoveVector += new Vector3(Input.GetAxis("Horizontal"), 0, 0);
        }
    }

    void RecievePlayerJumpInput()
    {
        if (Input.GetButton("Jump"))
            Jump();
    }

    void Jump()
    {
        M_Motor.Instance.Jump();
    }

    #endregion
}

Thanks for help…!

The gravity thing seems no good. You should keep the vertical speed in an auxiliary variable, because RecievePlayerInput is zeroing it; since gravity is an acceleration, you should apply it multiplied by Time.deltaTime, thus the vertical speed would be increased in the down direction at a constant rate. When the character is grounded, zero the vertical speed; when jumping, set it to JumpSpeed - but only do that when the character is grounded, or else it will jump even while in the air. Finally, you should apply the PlayerSpeed before gravity. I would do the following:

    ...
    void ProcessMotion()
    {
        if (MoveVector.magnitude > 1)
            MoveVector = Vector3.Normalize(MoveVector);
        MoveVector *= PlayerSpeed; // set move speed first...
        ApplyGravity(); // and apply gravity after
        M_Controller.CharController.Move(MoveVector *Time.deltaTime);
    }
    
    float vSpeed = 0; // have a private variable to hold vertical speed

    void ApplyGravity()
    {
        if (M_Controller.CharController.isGrounded)
        {
            vSpeed = 0; // zero vSpeed if character grounded
        }
        else
        {
            animation.CrossFade("fall");
        }
        vSpeed -= Gravity * Time.deltaTime; // apply gravity acceleration
        MoveVector.y = vSpeed; // set the vertical velocity component
    }

    public void Jump()
    {
        if (M_Controller.CharController.isGrounded)
        { // only jump if character is grounded
            vSpeed = JumpSpeed;
        }
    }