2016-01-19 3 views
2

У меня есть представление, более или менее точно такое же для 3 разных контроллеров. Единственное различие заключается в том, где они публикуют форму. Все эти контроллеры происходят из одного и того же базового класса, и представление содержит форму, которая будет отправлять одно из действий этого базового класса.Pass FormAction в модели с MVC Futures

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

@model Models.Forms.ContactPersonForm 
@{ 
    Layout = null; 
} 
<div class="modal-header"> 
    <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button> 
    <h4 class="modal-title">Edit contact person</h4> 
</div> 
@using (Html.BeginForm<ProductsController>(x => x.EditContactPerson(null), FormMethod.Post)) 
{ 
    <div class="modal-body"> 
     @Html.EditorForModel() 
    </div> 
    <div class="modal-footer"> 
     <button type="button" class="btn btn-default" data-dismiss="modal"> 
      <span class="fa fa-times" area-hidden="true"></span> Close 
     </button> 
     <button type="submit" class="btn btn-primary"> 
      <span class="fa fa-floppy-o" area-hidden="true"></span> Save 
     </button> 
    </div> 
} 

Вид сверху работает отлично. Но я хочу повторно использовать его для другого контроллера, который также наследует тот же базовый контроллер (и сообщения в действие EditContactPerson). Поэтому я хочу указать в модели, для которой контроллер должен отправлять сообщения. Я знаю, что могу использовать string overload как таковой:

@Html.BeginForm("EditContactPerson", "Products", FormMethod.Post) 

или

@Html.BeginForm(Model.Action, Model.Controller, FormMethod.Post) 

, но я действительно хочу использовать Expression вместо этого, например, так:

@Html.BeginForm<ProductsController>(x => x.EditContactPerson(null), FormMethod.Post) 

Есть ли способ Я могу использовать модель для рендеринга формы с помощью выражения из модели?

Что-то похож на:

@Html.BeginForm<Model.ControllerType>(Model.ActionExpression, FormMethod.Post) 
+0

Я хотел бы использовать простой HTML

тег без каких-либо HTML-хелперов расширений и вы проблема будет решена :) –

+0

@ Давид, да, ты совершенно прав. Дело в том, что я пытаюсь полностью набрать все маршруты. – smoksnes

+0

Не могли бы вы использовать шаблон DI и создать интерфейс, такой как IController, о, кстати ... Total Guess –

ответ

0

А что-то вроде этого:

@model Models.Forms.ContactPersonForm 
@{ 
    Layout = null; 
} 
<div class="modal-header"> 
    <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button> 
    <h4 class="modal-title">Edit contact person</h4> 
</div> 
@if (Model.XYZ == "...") 
{ 
    using (Html.BeginForm<ProductsController>(x => x.FirstAction(null), FormMethod.Post)) 
    { 
     Html.RenderPartial("FormContentPartialView"); 
    } 
} 
else 
{ 
    using (Html.BeginForm<ProductsController>(x => x.SecondAction(null), FormMethod.Post)) 
    { 
     Html.RenderPartial("FormContentPartialView"); 
    } 
}