0

У меня есть простая форма создания в MVC 4 и вы хотите две функции отправки: (1) Создать и (2) Создать & Печать. Создать - это нормальное действие Create и работает отлично. Создать & Печать должна сохранять объект, а затем запускать всплывающее окно браузера с данными из недавно сохраненного объекта. Исходное окно должно обновиться до пустой формы, готовой для другой записи.Отображение всплывающих окон с MVC, JavaScript

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

Ниже приведен пример, который работает на практике, однако у меня есть идентификатор, жестко закодированный. В идеале этот идентификатор будет динамически наследоваться от объекта, который был только что сохранен, и ссылки там. Является ли JavaScript лучшей идеей здесь или должен (может) я запускаю всплывающее окно из контроллера?

<input type="submit" value="Create" /> 
<input type="submit" 
    value="Create & Print" 
    onclick="window.open('Print/f1ad6330-2978-4ea9-9116-65f861412260' 
     , 'PRINT' 
     , 'height=200,width=200');" /> 
+0

Вы не можете сохранить объект, получить идентификатор обратно и использовать его для открытия всплывающего окна? –

+0

@ArsenMkrt да, теоретически это то, что мне нужно, но нужна помощь с синтаксисом. – dankeshawn

ответ

0

Я закончил тем, что отправил вызов формы по умолчанию в метод Create и создал только два новых метода. Это не идеально, но это работает.

РЕШЕНИЕ

Форма:

@using (Html.BeginForm("Dummy", "Count", FormMethod.Post, new { id = "form1" })) 
{ 
    // My Form 
    // Note the Dummy controller which will just fall through and do nothing 
} 

Форма добавления:

<input type="submit" value="Create & Print" onclick="createAndPrint();" /> 
<input type="submit" value="Create"   onclick="createWithoutPrinting();" /> 

JavaScript:

<script type="text/javascript"> 
    function createAndPrint() { 
     $.ajax(
     { 
      url: "CreateAndPrint", 
      type: "POST", 
      data: $("#form1").serialize(), 
      success: function (data) { 
       var lastInsId = data; // you will get last insert id here. 
       var secWin = window.open('Print/' + lastInsId 
       , 'PRINT' 
       , 'height=450,width=230'); 
       secWin.focus(); 
      } 
     }); 
    } 
</script> 
<script type="text/javascript"> 
    function createWithoutPrinting() { 
     $.ajax(
     { 
      url: "Create", 
      type: "POST", 
      data: $("#form1").serialize() 
     }); 
    } 
</script> 

Контроллер:

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Dummy(Count count) 
{ 
    return RedirectToAction("Create"); 
} 

[HttpPost] 
public string CreateAndPrint(Count count) 
{ 
    SaveCount(count); 

    if (Request.IsAjaxRequest()) 
    { 
     // Now get last insert id 
     string lastInsertId = count.Id.ToString(); 
     return lastInsertId; 
    } 

    return ""; 
} 

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Create(Count count) 
{ 
    SaveCount(count); 

    if (Request.IsAjaxRequest()) 
    { 
     // Now get last insert id 
     string lastInsertId = count.Id.ToString(); 
     return PartialView("_Create", lastInsertId); 
    } 

    return RedirectToAction("Create"); 
} 
1

Лучший вариант заключается в создании другого действия, которое возвращает строку (последнюю вставку-ID), почтовые данные к нему через AJAX и получить последний-вставки идентификатор обратно в JavaScript, то вы можете использовать его, чтобы открыть новое окно , Теперь предположим, что это новое действие контроллера:

[HttpPost] 
     public string CreateAndPrint(Object obj) 
     { 
      // Save data here/insert record here 

      if (Request.IsAjaxRequest()) 
      { 
      // Now get last insert id 
      string lastInsertId = db.GetLastInsertId; // get last insert id from database 
      return lastInsertId; 
      } 
     } 

Есть яваскрипта функцию, чтобы отправить данные:

<script type="text/javascript"> 
     function creteAndPrint() { 
     $.ajax(
     { 
      url : "CreateAndPrint", 
      type: "POST", 
      data : $("#from1").serialize(), 
      success:function(data) 
      { 
       var lastInsId = data; // you will get last insert id here. 
       var secWin = window.open('Print/'+lastInsId 
       , 'PRINT' 
       , 'height=200,width=200'); 
       secWin.focus(); 
      } 
     }); 
     } 
    </script> 

И вызвать эту функцию только создать & кнопку печати:

<input type="submit" value="Create & Print" onclick="creteAndPrint();" /> 

Надеюсь, это сработает для вас. Спасибо.


Здесь я редактирую мой ответ на ваш комментарий :)

Да! вы можете вызвать то же самое действие Create для достижения того же, что я объяснил выше. Но для этого вам придется внести некоторые изменения в ваших Create действий:

public string Create(Object obj) 
     { 
      // Save data here/insert record here 

      if (Request.IsAjaxRequest()) 
      { 
      // Now get last insert id 
      string lastInsertId = db.GetLastInsertId; // get last insert id from database 
      return PartialView("_Create", lastInsertId); 
      } 
      return View(); 
     } 

Обратите внимание, что при вызове этого действия через AJAX он будет возвращать частичный вид, который возвращал только LAST_INSERT_ID в виде строки. Вы просто создали один простой частичный вид _Create для печати last-insert-id. Частичный вид будет иметь только две строки:

@model string 
@Model 

Это будет печатать последнюю инст-идентификатор, который мы прошли от действия контроллера.

+0

Это выглядит как решение, однако оно по-прежнему удаляет метод Create после нажатия на метод CreateAndPrint. Я думаю, что метод Create является значением по умолчанию для формы. Есть ли способ обойти Create(), если вызывается CreateAndPrint()? Спасибо! – dankeshawn

+0

еще мне нужна главная страница, чтобы применить метод Create(), а не метод Create (Object obj), который сохраняет объект, который был сохранен только в вызове CreateAndPrint (Object obj). – dankeshawn

+0

@dankeshawn, пожалуйста, проверьте отредактированный ответ, забудьте о действии 'CreateAndPrint', просто внесите некоторые изменения в действие' Crete'. :) – BabyDuck

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