2011-02-04 7 views
2

У меня есть контроллер, который загружает файл. Я хотел бы вернуть json-результат с успехом bool (если он был успешно загружен в противном случае false) и сообщением (это может быть сообщение об ошибке, которое произошло, или ссылка на файл или ссылку на изображение, в зависимости от того, что было загружено).MVC Return Json result

Каков наилучший способ приблизиться к этому?

Я это

public class UploadedFile 
{ 
    public bool Success { get; set; } 

    public string Message { get; set; } 
} 

тогда в моем контроллере я установил бы Success истину/или/ложь и сообщения для <a href ИЛИ <img

я на правильном пути?

Как бы я разобрал это в представлении, чтобы при изображении оно отображало изображение, если ссылка показывает ссылку, если ошибка просто предупреждает об ошибке. спасибо

ответ

4

Почему вы хотите его разобрать? Не можете ли вы предоставить больше информации о том, что вы возвращаете в Json?

Может быть что-то вроде этого:

public class UploadedFile 
{ 
    public bool Success { get; set; } 
    public string Message { get; set; } 
    public Kind MessageKind { get; set; } 
} 

public enum Kind 
{ 
    Error, 
    File, 
    Image 
} 

В зависимости от MessageKind, вы просто должны использовать правильную HTML для отображения результата.

4

Вы на правильном пути. Я бы рекомендовал вам использовать jquery form plugin, который позволит вам AJAXify <form> и обработать случай успеха.

Пример:

Модель:

public class UploadedFile 
{ 
    public bool Success { get; set; } 
    public string Url { get; set; } 
    public string Message { get; set; } 
} 

Контроллер:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     var model = new MyViewModel(); 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(HttpPostedFileBase file) 
    { 
     if (file != null && file.ContentLength > 0) 
     { 
      var images = Server.MapPath("~/images"); 
      var filename = Path.Combine(images, Path.GetFileName(file.FileName)); 
      file.SaveAs(filename); 
      return View("UploadedFile", new UploadedFile 
      { 
       Success = true, 
       Url = Url.Content("~/images/" + Path.GetFileName(file.FileName)) 
      }); 
     } 
     return View("UploadedFile", new UploadedFile 
     { 
      Success = false, 
      Message = "Please upload a file" 
     }); 
    } 
} 

Вид:

<script src="@Url.Content("~/scripts/jquery.form.js")" type="text/javascript"></script> 
<script type="text/javascript"> 
    $(function() { 
     $('form').ajaxForm(function (result) { 
      $('#result').html(result); 
     }); 
    }); 
</script> 

@using (Html.BeginForm("index", "home", FormMethod.Post, new { enctype = "multipart/form-data" })) 
{ 
    <input type="file" name="file" /> 
    <input type="submit" value="Save" /> 
} 

<div id="result"></div> 

и UploadedFile частичный:

@model AppName.Models.UploadedFile 
@{ 
    Layout = null; 
} 

@if (Model.Success) 
{ 
    <img src="@Model.Url" alt="" /> 
} else { 
    @Model.Message 
}