MVC-кнопка отправки не работает с несколькими частичными представлениями

Я новичок в MVC, поэтому, пожалуйста, полегче со мной. Мне передали проект, который был запущен в MVC, и мне сказали добавить к нему. Я был в порядке, пока не добрался до раздела, который нуждался в данных из двух разных моделей. Теперь я застрял, и мой босс хочет, чтобы это было сделано вчера. Пожалуйста, помогите, если сможете.

у меня есть представление с двумя частичными представлениями и кнопкой отправки. В каждом частичном представлении используется своя модель. Представления отображают на экране информацию, которую пользователь может изменить. Этот тогда и кнопки Submit. В контроллере я хотел бы получить доступ к данным из обеих моделей (значения, которые пользователь ввел на экране). Сейчас я даже не могу сделать кнопку отправки вызова контроллера. Это часть, с которой мне нужна немедленная помощь, но мне в конечном итоге нужно будет знать, как получить доступ к данным обеих моделей от контроллера.

вот основная идея того, что я хочу сделать:

enter image description here

Это мой взгляд: CreateContract.cshtml по

<div class="container-fluid">
@using (Html.BeginForm("CreateContract", "CreateContract", FormMethod.Post, new { @class = "form-horizontal " }))
{
                <div id="PartialDiv">
            @{
        Html.RenderPartial("ApplicationPartialView", new CarmelFinancialWeb.Models.ModelApplication());
        Html.RenderPartial("ContractPartialView");
            }
        </div>
            <input id="btnCreateContract" type="submit" class="btn btn-primary" value="Save" name="CreateContract" />
}
    </div>

это часть контроллера CreateContractController.цезий. Этот метод попадает, когда представление открывается и работает правильно.

        [AuthorizeAdmin]
    public ActionResult CreateContract(string ID)
    {
        ModelContract obj_Contract = new ModelContract();

        obj_Contract.BuyerName = "MOCS";

        return View(@"~/Views/CreateContract/CreateContract.cshtml", obj_Contract);
    }

это часть контроллера CreateContractController.цезий. Этот метод не попадает при нажатии кнопки отправки. Я попытался включить переменную string ID из другого метода и ModelContract и ModelApplication (и различные их комбинации), но я не могу получить это метод, который нужно вызвать.

        [AuthorizeAdmin]
    [HttpPost]
    public ActionResult CreateContract()
    {
         ModelApplication obj_App = new ModelApplication();
         return View(@"~/Views/CreateContract/CreateContract.cshtml", obj_App);

    }

Это методы в контроллере для частичных представлений. Не звонил.

        public PartialViewResult ApplicationPartialView(string ID)
    {
        ModelApplication obj_App = new ModelApplication();

        if (ID != null && ID != "0" && ID != null && ID != "")
        {
            obj_App = objBllApplication.GetApplicationByID(int.Parse(ID));
        }

        return PartialView("CreateContractApplicationPartialView");
    }

    public PartialViewResult ContractContractPartialView()
    {
        ModelContract obj_Contract = new ModelContract();

        obj_Contract.DealerID = "MOCS";

        return PartialView("CreateContractContractPartialView");
    }

1 ответов


здесь много происходит под капотом, что полезно для вас знать, особенно потому, что вы новичок в этом. Во-первых, вид может иметь только один модель. Причина высокого уровня заключается в том, что он фактически отображается через общий класс, который выбранная модель заполняет как тип. Вы можете несколько обмануть, как вы здесь, используя частичные представления, но вам все равно нужно получить экземпляр модели в них. Кажется, вы пытаетесь сделать это, создавая действия в своем контроллере, чтобы представляют эти партиалы, но они фактически бесполезны. Их никогда не вызывают. Html.Partial или Html.RenderPartial просто отобразит указанное представление либо с той же моделью, что и вызывающее представление, по умолчанию, либо объект, переданный этим методам в качестве модели (второй параметр). Он не возвращается к контроллеру.

в MVC есть что-то под названием "дочерние действия", которые работают так, как вы, похоже, хотите, чтобы частичные здесь. Используя Html.Action или Html.RenderAction вместо этого вы можете назвать это действия на контроллере, возвращающие частичные представления. Но есть две вещи:--11-->

  1. если вы собираетесь вернуть частичный вид (вместо полноценного вида), то вы должны украсить действие с [ChildActionOnly]. В противном случае действия подвергаются прямому URL-доступу из браузера, который будет отображать только частичное представление без макета.

  2. дочерние действия могут использоваться только для запросов GET-style. Нельзя отправлять сообщения ребенку действие.

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

в вашем конкретном сценарии частичные представления на самом деле являются способом, но вам просто нужно настроить модель вашего основного представления, чтобы быть моделью представления, которая содержит обе подмодели. Например:

public class MyAwesomeViewModel // name doesn't matter
{
    public ModelApplication Application { get; set; }
    public ModelContract Contract { get; set; }
}

затем, в основной вид:

@model Namespace.To.MyAwesomeViewModel

...

@Html.Partial("ApplicationPartialView", Model.Application)
@Html.Partial("ContractPartialView", Model.Contract)

наконец, ваше действие POST будет принимать эту модель представления в качестве параметра:

[HttpPost]
public ActionResult CreateContract(MyAwesomeViewModel model)
{
    ...
}