2

В проекте MVC5 я открываю модальное диалоговое окно, и в случае возникновения исключения я хочу открыть это диалоговое окно и отобразить сообщение в div в этом диалоговом окне. Насколько я вижу, я должен следовать этому подходу как рендеринг частичного просмотра в строку, но большинство примеров не работает в MVC5, как на Return Partial View and JSON from ASP.NET MVC Action. Есть ли какой-либо аналогичный или лучший подход для MVC5?Возвращение Partialview & JSON от контроллера MVC 5

+1

вы хотите показать ошибки на модальном, а не на частичном представлении с ошибками? – Monah

+0

На самом деле я представляю частичный вид для создания, обновления и т. Д., И если в методе Create action в контроллере есть ошибка, я хочу отобразить частичное представление _Error вместо _Create и отобразить некоторые сообщения (возвращенные из метода действий как json) в частичном просмотре. –

ответ

2

Вы можете сделать следующее

Решение 1 (используя частичный вид)

[HttpPost] 
public ActionResult YourAction(YourModel model) 
{ 
    if(model!=null && ModelState.IsValid) 
    { 
      // do your staff here 
      Response.StatusCode = 200; // OK 
      return PartialView("ActionCompleted"); 
    } 
    else 
    { 
      Response.StatusCode = 400; // bad request 
      // ModelState.ToErrors() : is an extension method that convert 
      // the model state errors to dictionary 
      return PartialView("_Error",ModelState.ToErrors()); 
    } 
} 

Ваш частичный вид должен выглядеть следующим образом:

<div id="detailId"> 
    <!-- Your partial details goes here --> 
    .... 
     <button type="submit" form="" value="Submit">Submit</button> 

</div> 

ваш сценарий

<script> 
    $(document).ready(function(){ 
     $('#formId').off('submit').on('submit', function(e){ 
       e.preventDefault(); 
       e.stopPropagation(); 

       var form = $('#formId'); 
       $.ajax({ 
        url: form.attr('action'), 
        data: form.serialize(), 
        method: 'post', 
        success : function(result){ 
         $('#detailId').replaceWith(result); 
         // another option you can close the modal and refresh your data. 
        }, 
        error: function(data, status, err){ 
         if(data.status == 400){ 
          $('#detailId').replaceWith(data.responseText); 
         } 
        } 
       }); 

     }); 
    }); 
</script> 

Решение 2 (с использованием JSon)

в своем действии

[HttpPost] 
public ActionResult YourAction(YourModel model) 
{ 
    if(model!=null && ModelState.IsValid) 
    { 
      // do your staff here    
      return Json(new {status = 200, 
          //...any data goes here... for example url to redirect 
         url=Url.Content("YourRedirectAction","Controller")}, 
    } 
    else 
    {    
      return Json(new {status= 400,errors = ModelState.ToErrors()}); 
    } 
} 

и ваш скрипт должен выглядеть

<script> 
    $(document).ready(function(){ 
     $('#formId').off('submit').on('submit', function(e){ 
       e.preventDefault(); 
       e.stopPropagation(); 

       var form = $('#formId'); 
       $.ajax({ 
        url: form.attr('action'), 
        data: form.serialize(), 
        method: 'post', 
        success : function(result){ 
         if(result.status==200) { // OK 
          // you might load another action or to redirect 
          // this conditions can be passed by the Json object 
         } 
         else{ // 400 bad request 
          // you can use the following toastr based on your comment 
          // http://codeseven.github.io/toastr/demo.html 
          var ul = $('<ul>') 
          for(var error in result.errors) 
          { 
           ul.append('<li><b>' + error.Key + '</b>:' + error.Value + '</li>; 
          } 
          toastr["warning"](ul[0].outerHTML); 
         } 
        } 
       }); 

     }); 
    }); 
</script> 

Наконец, если вы хотите удлиняющей ModelState.ToErrors()

public static IEnumerable ToErrors(this ModelStateDictionary modelState) 
{ 
    if (!modelState.IsValid) 
    { 
     return modelState.ToDictionary(kvp => kvp.Key, 
       kvp => kvp.Value.Errors 
          .Select(e => e.ErrorMessage).First()) 
          .Where(m => m.Value.Count() > 0); 
    } 
    return null; 
} 

надеюсь, что это вам поможет

+0

Большое спасибо, я попробую. Проголосовал + –

+0

@binary это сработало с вами? – Monah

+0

На самом деле, но я предпочел использовать другой подход и отображать сообщение тоста без открытия модального диалога. Спасибо ... –

0

Это верный пример, я использовал эту технику много раз. Если это простой вызов вызова, я бы предложил сделать частичный просмотр данных, которые вы хотите показать, и называть их через jquery с кодом ниже.

$("#result").load("@Url.Action("Account","HelloPartial")"); 

это будет загружать частичный вид его самого во всплывающем окне. вам не придется преобразовывать его в строки.

Смежные вопросы