2016-12-14 97 views
0

我有一個服務從我的控制器調用上傳圖像。這很好,但是當條件不符合時,它現在返回'null',這是沒有幫助或優雅的。當前的代碼:從模型傳回錯誤信息的最佳方法?

public async Task<string> UploadPropertyImageAsync(HttpPostedFileBase imageToUpload) 
    { 
     string imageFullPath = null; 
     if (imageToUpload == null || imageToUpload.ContentLength == 0 || imageToUpload.ContentLength >= 8388608) 
     { 
      return null; 
     } 

     WebImage img = new WebImage(imageToUpload.InputStream); 
     if (img.Width < 1000) 
     { 
      return null; 
     }  

     try 
     { 
      //Do Something 
     } 
     catch (Exception ex) 
     { 
      //Log something 
     } 
     return imageFullPath; 
    } 
} 

我試圖通過ViewBag和TempData的背,但也似乎是有效的代碼?我如何編寫錯誤消息字符串並將其傳回給視圖?

謝謝,加文

添加控制器的方法

[HttpPost] 
    public async Task<ActionResult> Upload([Bind(Include = "ID,Caption")] HttpPostedFileBase photo, PropertyImage image, int propertyId) 
    { 
     var imageUrl = await imageService.UploadPropertyImageAsync(photo); 
     var imageGuid = Guid.NewGuid(); 
     image.Original_URL = imageUrl.ToString(); 
     image.PropertyID = propertyId; 
     image.DateCreated = DateTime.Now; 
     image.ID = imageGuid; 
     image.Status = true; 
     db.PropertyImage.Add(image); 
     await db.SaveChangesAsync(); 
     return RedirectToAction("Index"); 
    } 

回答

1

你的行動應該返回Task<ActionResult>如果它是一個MVC應用程序或Task<IHttpActionResult>,如果它是一個Web API。

在您的代碼中,如果不符合條件,則返回一個錯誤請求,使用ControllerApiController類中都存在的返回BadRequest()輔助方法。 您還可以在請求正文中包含其他信息。

所以,你的代碼應該是這樣的:

[HttpPost] 
    public async Task<ActionResult> Upload([Bind(Include = "ID,Caption")] HttpPostedFileBase photo, PropertyImage image, int propertyId) 
    { 
     var imageUrl = await imageService.UploadPropertyImageAsync(photo); 
     if(imageUrl == null) 
      return BadRequest(); 
     else 
     { 
     var imageGuid = Guid.NewGuid(); 
     image.Original_URL = imageUrl.ToString(); 
     image.PropertyID = propertyId; 
     image.DateCreated = DateTime.Now; 
     image.ID = imageGuid; 
     image.Status = true; 
     db.PropertyImage.Add(image); 
     await db.SaveChangesAsync(); 
     return RedirectToAction("Index"); 
     } 
    } 


    public async Task<IHttpActionResult> UploadPropertyImageAsync(HttpPostedFileBase imageToUpload) 
    { 
     string imageFullPath = null; 
     if (imageToUpload == null || imageToUpload.ContentLength == 0 || imageToUpload.ContentLength >= 8388608) 
     { 
      return null; 
     } 

     WebImage img = new WebImage(imageToUpload.InputStream); 
     if (img.Width < 1000) 
     { 
      return null; 
     }  

     try 
     { 
      //Do Something 
     } 
     catch (Exception ex) 
     { 
      //Log something 
     } 
     return imageFullPath; 
    } 
} 
+0

但這代碼在控制器中不存在的,它是「從」控制器調用。所以返回BadRequest()是不可能的吧? – Gavin5511

+0

你是什麼意思,它是從控制器調用?你的意思是這是一個輔助方法,並從控制器動作調用或什麼? –

+0

我已經添加了控制器代碼到我原來的問題 – Gavin5511

0

你的任務是返回一個字符串!

所以你可以做這樣的事情

if (imageToUpload == null || imageToUpload.ContentLength == 0 || imageToUpload.ContentLength >= 8388608) 
{ 
      return "MY_ERROR_STRING"; 
} 

不是最好的方式在所有

我的建議是回到一個簡單的對象

public class ResultObj(){ 
    public bool Success {get;set;}; 
    public string Result {get;set;}; 
} 

然後測試成功,如果屬實結果是路徑,如果爲false,則爲您的錯誤消息。所以你的代碼看起來像

public async Task<ResultObj> UploadPropertyImageAsync(HttpPostedFileBase imageToUpload) 
    { 
     ResultObj result = null; 
     if (imageToUpload == null || imageToUpload.ContentLength == 0 || imageToUpload.ContentLength >= 8388608) 
     { 
      result.Success= False; 
      result.Result = "We have error" ; 
      return result; 
     } 

     WebImage img = new WebImage(imageToUpload.InputStream); 
     if (img.Width < 1000) 
     { 
      result.Success= False; 
      result.Result = "We have a different error" ; 
      return result; 
     }  

     try 
     { 
      //Do Something 
     } 
     catch (Exception ex) 
     { 
      //Log something 
     } 
     result.Success= true; 
     result.Result = imageFullPath; 
     return result; 
    } 
相關問題