2016-09-06 1 views
0

У меня есть частичный вид, который имеет форму - я запускаю это частичное из Домашнего контроллера.Форма сообщения от модального частичного представления к другому контроллеру с атрибутом routeeprefix

@using (Html.BeginForm("CloudContent","Files", FormMethod.Post, new { enctype = "multipart/form-data" })) 
{ 
    <div id="container"></div> 
    <input type="submit" name="PostMe" title="Submit" value="Submit Form" /> 
    @Html.HiddenFor(m => m.MyProperty); 
    @Html.HiddenFor(m => m.SelectedIds); 
} 

Я хочу отправить эту форму в контроллер файлов, однако контроллер файлов имеет префикс маршрута: [RoutePrefix("sth/api/v1/files")]

что приводит к моей форме действия порожняком.

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

Метод, который я хочу отправить в контроллер файлов:

[HttpPost] 
[Route("getcloudcontent")] 
public List<ConnectedFile> CloudContent(CloudFilesModel model) 
{ 
    //do magic 
} 
+0

Вместо использования html-помощника вы можете написать html самостоятельно. Помощники велики, если это именно то, что вы хотите, но может быть больно, если вы вообще отклоняетесь от того, что они делают. Другой вариант - написать пользовательский помощник. Если это 1-офф, тогда это не стоит. – nurdyguy

+0

Другие варианты включают запись собственного маршрута в RouteConfig.cs (ick) или добавление атрибута маршрута к методу в контроллере файлов. Если у вас нет доступа к тем, хотя явным образом пишу маршрут формы, это ваш лучший выбор. – nurdyguy

+0

@nurdyguy - я могу добавить атрибут маршрута к методу в контроллере файлов. На самом деле у меня есть один '[Route (« getcloudcontent »)]', но я полагаю, что префикс все еще имеет значение? – Bartosz

ответ

1

UPDATE:

Вот еще один пример, который включает в себя частичное действие вид/ребенок:

HomeController.cs:

using System.Web.Mvc; 

public class HomeController : Controller 
{ 
    [Route("~/")] 
    public ActionResult Index() 
    { 
     return View(); 
    } 

    [Route("ModalContent")] 
    [ChildActionOnly] 
    public ActionResult ModalContent() 
    { 
     return View(); 
    } 
} 

FilesController.cs:

using System.Web.Mvc; 

[RoutePrefix("sth/api/v1/files")] 
public class FilesController : Controller 
{ 
    [HttpPost] 
    [Route("getcloudcontent")] 
    public ActionResult CloudContent(string model) 
    { 
     return Content("test"); 
    } 
} 

Views \ Home \ Index.cshtml:

<!DOCTYPE html> 
<html> 
<head> 
    <title>Test</title> 
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"> 
</head> 
<body> 
    <button type="button" class="btn btn-primary btn-lg" data-toggle="modal" data-target="#myModal"> 
     Show modal 
    </button> 

    <div class="modal fade" id="myModal" tabindex="-1"> 
     <div class="modal-dialog"> 
      <div class="modal-content"> 
       <div class="modal-body"> 
        @Html.Action("ModalContent") 
       </div> 
      </div> 
     </div> 
    </div> 

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> 
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> 
</body> 
</html> 

Views \ Home \ ModalContent.cshtml:

@using (Html.BeginForm("CloudContent", "Files", FormMethod.Post, new { enctype = "multipart/form-data" })) 
{ 
    <div id="container"></div> 
    <input type="submit" name="PostMe" title="Submit" value="Submit Form" /> 
} 

Global.asax.cs:

using System.Web.Mvc; 
using System.Web.Routing; 

public class MvcApplication : System.Web.HttpApplication 
{ 
    protected void Application_Start() 
    { 
     RouteTable.Routes.MapMvcAttributeRoutes(); 
    } 
} 

И результат HTML:

<!DOCTYPE html> 
<html> 
<head> 
    <title>Test</title> 
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"> 
</head> 
<body> 
    <button type="button" class="btn btn-primary btn-lg" data-toggle="modal" data-target="#myModal"> 
     Show modal 
    </button> 

    <div class="modal fade" id="myModal" tabindex="-1"> 
     <div class="modal-dialog"> 
      <div class="modal-content"> 
       <div class="modal-body"> 
        <form action="/sth/api/v1/files/getcloudcontent" enctype="multipart/form-data" method="post"> 
         <div id="container"></div> 
         <input type="submit" name="PostMe" title="Submit" value="Submit Form" /> 
        </form> 
       </div> 
      </div> 
     </div> 
    </div> 

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> 
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> 
</body> 
</html> 

Существует что-то другое, что не так с вашим кодом. Я запустил ваш код, и он работал без каких-либо проблем.

Вот код:

FilesController.cs:

using System.Web.Mvc; 

namespace Controllers 
{ 
    [RoutePrefix("sth/api/v1/files")] 
    public class FilesController : Controller 
    { 
     [Route("")] 
     public ActionResult Index() 
     { 
      return View(); 
     } 

     [HttpPost] 
     [Route("getcloudcontent")] 
     public ActionResult CloudContent(string model) 
     { 
      return Content("test"); 
     } 
    } 
} 

Index.cshtml:

@using (Html.BeginForm("CloudContent", "Files", FormMethod.Post, new { enctype = "multipart/form-data" })) 
{ 
    <div id="container"></div> 
    <input type="submit" name="PostMe" title="Submit" value="Submit Form" /> 
} 

global.asax.CS:

using System.Web.Mvc; 
using System.Web.Routing; 

public class MvcApplication : System.Web.HttpApplication 
{ 
    protected void Application_Start() 
    { 
     RouteTable.Routes.MapMvcAttributeRoutes(); 
    } 
} 

Когда я иду в http://localhost/sth/api/v1/files я вижу следующий HTML:

<!DOCTYPE html> 
<html> 
<head><title>Test</title></head> 
<body> 
    <form action="/sth/api/v1/files/getcloudcontent" enctype="multipart/form-data" method="post"> <div id="container"></div> 
    <input type="submit" name="PostMe" title="Submit" value="Submit Form" /> 
</form> 
</body> 
</html> 

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

+0

Протестировано с частичным видом. Работает также. –

+0

Спасибо - может это вопрос моего PartialView, возвращаемого из какого-либо действия на Домашнем контроллере и отображаемого в качестве загрузочного модального? – Bartosz

+0

Это не должно, так как частичные изображения отображаются на стороне сервера в результате вызова '@ Html.Partial (partialViewName)', поэтому они «не знают», где они получают визуализацию. Но на основе вашего комментария «частичное представление возвращается из действия контроллера». Я думаю, вы имели в виду действие с дочерью, что немного отличается. Позвольте мне обновить свой ответ другим примером. –

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