2009-05-29 2 views
4

У меня есть веб-страница, отображающая список элементов в таблице HTML. Над списком находится форма, которая позволяет пользователю добавлять новый элемент в список через AJAX (используя Ajax.BeginForm). Когда данные отправляются в контроллер через AJAX, я добавляю новый элемент в базу данных базы данных и генерирую новую строку таблицы через Partial View, которая затем добавляется к существующей таблице.Использовать различные updatetargetid на основе вида

Если форма для добавления новых элементов, однако, содержит ошибки, я хочу вернуть форму в веб-браузер и отобразить ее.

Итак, вот вопрос: можно ли указать UpdateTargetId из контроллера? В настоящий момент любой вид, который я возвращаю с контроллера, вставлен в одну и ту же цель, но я хотел бы обновить другую цель (то есть другую UpdateTargetId) на основе любого вида, возвращаемого контроллером.

Любая помощь будет оценена ...

+0

Почему вы хотите сделать это? Разве это не нарушает разделение проблемы беспокойства и не усложняет ваш контроллер? Возможно, проще их разделить на разные действия контроллера, чтобы упростить и реорганизовать аналогичный код в свой собственный метод. –

+0

Не видите, как вы можете разделить его. Это процесс: Пользователь вводит данные в форме. Форма отправляется через AJAX. Если форма содержит ошибки, она должна быть возвращена в браузер, отображая ошибки. Если он не содержит ошибок, в таблицу должна быть добавлена ​​новая строка. Это два разных разных вида, которые * могут быть возвращены в браузер, и каждый из этих двух видов должен каждый раз заходить в разные заполнители. –

ответ

0

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

RedirectToAction(new {controller="home", action="index", id=931,variable="abc"}); 

так, если форма содержит RedirectToAction ошибки ... который даже может содержать другой PartialView, который может быть помещен в другой DIV ...

просто мысль ...

+0

К сожалению, это не будет полезно, поскольку регион для обновления в представлении будет по-прежнему остальным. Что нужно Джерри, так это изменить обновляемый регион в зависимости от результата, который, насколько мне известно, невозможен. –

+0

Нам необходим флажок на стороне клиента, чтобы определить, какой div мы должны обновить. одним из способов сделать это является json. однако мой вышеприведенный ответ не будет служить цели, потому что PartialView() не возвращает строку html, как я ожидал. u может написать собственную функцию ur, которая преобразует partialView в Html String и возвращает ее в Jsonresult вместе с флагом успеха. –

0

в основном то, что вы ва nt должен возвращать 2 разных результата в зависимости от определенных условий, пока вы делаете запрос ajax. К сожалению, это невозможно с фактической реализацией AjaxForm. Вы можете обновить только один регион своей формы.

Возможным обходным решением этой проблемы может быть создание частичного представления с формой для обновления и возврата частичного представления с контроллера, после чего вы создаете новую строку в таблице с простым старым javascript в событии onSuccess.

5

Я думаю, что обходной путь может использовать json и проверять результат в функции обратного вызова. Вот как это будет выглядеть

function handleAjax(response) { 

      var result = response.get_response().get_object(); 
      var isSuccess = result[0].isSuccess; 
      if(isSuccess = "true") 
      { 
       $("#resultdiv").html(result[0].html); 
      } 
      else 
      { 
       $("#formdiv").html(result[0].html); 
      } 

     } 

в своем действии и может написать что-то вроде

public ActionResult SaveRecord(Entity entity) 
{ 
    if(ModelState.IsValid(){ 
    return Json(new{isSuccess = true, html = PartialView("RowViewName")}); 
    } 
    else 
    { 
    return json (new{isSuccess = false, html = PartialView("FormViewName")}) 
    } 
} 

я просто столкнулся с той же проблемой сегодня и не мог найти «законный» способ сделать это. Я думаю, что это простое обходное решение должно сделать это. в настоящий момент код полностью непроверен. Я собираюсь осуществить это завтра утром.
Примечание: Пожалуйста, прочитайте это blog post для альтернативного решения
рассматривает

+1

PartialView («RowViewName») не возвращает строку, как я ожидал, отправляя этот ответ. вы должны использовать метод, который может выполнять ViewResult и возвращать строку. проверьте http://stackoverflow.com/questions/483091/render-a-view-as-a-string для визуализации представления строки –

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