Reputation: 4067
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
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