簡體   English   中英

MVC - 提交按鈕不能處理多個部分視圖

[英]MVC - Submit button not working with multiple partial views

我是MVC的新手,所以請放輕松我。 我收到了一個在MVC中啟動的項目,並被告知要添加它。 我很好,直到我得到一個需要兩個不同模型的數據的部分。 現在我被困住了,我的老板昨天想要這樣做。 如果可以的話請幫忙。

我有一個視圖有兩個部分視圖和一個提交按鈕。 每個部分視圖使用不同的模型。 視圖在屏幕上顯示用戶可以改變的信息。 然后單擊提交按鈕。 在控制器中,我想訪問兩個模型中的數據(用戶在屏幕上輸入的值)。 現在,我甚至無法通過提交按鈕來呼叫控制器。 這是我需要立即幫助的部分,但我最終需要知道如何從控制器訪問兩個模型的數據。

這是我想要做的基本想法:

在此輸入圖像描述

這是我的觀點: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.cs的一部分。 當視圖打開並且工作正常時,會觸發此方法。

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

        obj_Contract.BuyerName = "MOCS";

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

這是控制器CreateContractController.cs的一部分。 單擊提交按鈕時,不會觸發此方法。 我嘗試過包含其他方法的字符串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");
    }

這里有很多內容,這對你有所幫助,特別是因為你是新手。 首先,視圖只能有一個模型。 高級別的原因是它實際上是通過一個通用類來呈現的,所選擇的模型就像它的類型一樣填充。 你可以通過使用部分視圖來欺騙你,但是你仍然必須將模型實例納入其中。 看起來你試圖通過在控制器中創建動作來表示那些部分,但這些實際上是沒用的。 他們永遠不會被召喚。 Html.PartialHtml.RenderPartial將僅顯示指定視圖,默認情況下使用與調用視圖相同的模型,或者作為模型傳遞給這些方法的對象(第二個參數)。 它不會返回控制器。

在MVC中,有一種稱為“子操作”的東西,因為你似乎想要部分到這里工作。 通過使用Html.ActionHtml.RenderAction ,您可以在控制器上調用返回部分視圖的此操作。 但有兩件事:

  1. 如果您要返回部分視圖(而不是完整視圖),則應使用[ChildActionOnly]修飾操作。 否則,操作將暴露給來自瀏覽器的直接URL訪問,這將單獨呈現局部視圖,而不進行任何布局。

  2. 子操作只能用於GET樣式的請求。 您無法POST到子操作。

對於這樣的事情來說,實際上最好只使用子動作來呈現表單的單獨區域,如果表單的各個區域將被發布到不同的位置。 以組合頁面為例,您可以同時擁有登錄或注冊概念。 您可以使用子操作來呈現每個單獨的字段組,但登錄部分應POST到登錄操作,並且注冊部分應發布到注冊操作。 您不會將兩個表單中的所有內容都發布到同一個操作中。

在您的特定場景中,部分視圖實際上是要走的路,但您只需要將主視圖的模型調整為包含兩個子模型的視圖模型。 例如:

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)
{
    ...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM