ksg
ksg

Reputation: 4067

RedirectToAction inside a void method

I know we cant use RedirectToAction inside a void method, but how can I bypass the below scenario. Please see the comments which explains the scenario well.

public void CertificateVerification(string regNo)
{
    try
    {
        var _dbRegn = _db.StudentRegistrations
                    .Where(r => r.RegistrationNumber == regNo)
                    .FirstOrDefault();
        //checking if registration exist
        if (_dbRegn != null)
        {
            var _isCertificateIssued = _dbRegn.IsCertificateIssued.Value;
             //checking if certificate issued
            if (_isCertificateIssued)
            {
                string FilePath = Server.MapPath("~/Certificates/" + _dbRegn.RegistrationNumber + ".pdf"); ;
                WebClient User = new WebClient();
                Byte[] FileBuffer = User.DownloadData(FilePath);
                if (FileBuffer != null)
                {
                    Response.ContentType = "application/pdf";
                    Response.AddHeader("content-length", FileBuffer.Length.ToString());
                    Response.BinaryWrite(FileBuffer);
                    Response.End();
                }
            }
            //if certificate not issued then redirect to specific page
            else
            {
                 RedirectToAction("CertificateNotApproved");
            }
        }
        //if registration dont exist redirect to specific page
        else
        {
             RedirectToAction("CertificateDontExist");
        }
    }
    catch (Exception ex)
    {
        RedirectToAction("CertificateDontExist");
    }
}

Upvotes: 1

Views: 1335

Answers (1)

Erik Philips
Erik Philips

Reputation: 54628

Rewrite the method so it does what you want

public bool IsCertificateValid(string regNo, string redirectTo)
{
    redirectTo = null;
    try
    {
        var _dbRegn = _db.StudentRegistrations
                    .Where(r => r.RegistrationNumber == regNo)
                    .FirstOrDefault();
        if (_dbRegn != null)
        {
            var _isCertificateIssued = _dbRegn.IsCertificateIssued.Value;
            if (_isCertificateIssued)
            {
              // unimportant code...
            }
            else
            {
                 redirectTo = "CertificateNotApproved";
            }
        }
        else
        {
             redirectTo = "CertificateDontExist";
        }
    }
    catch (Exception ex)
    {
        redirectTo  = "CertificateDontExist";
    }

    return !string.IsNullOrEmpty(redirectTo);
}

usage:

string redirectTo;
if (!IsCertificateValid(regNo, out redirectTo)
{
  return RedirectToAction(redirectTo);
}

Upvotes: 2

Related Questions