2014-10-09 65 views
7

我是MVC的新手,所以請對我輕鬆點。我被遞交了一個在MVC中開始的項目,並被告知要添加它。直到我找到需要來自兩種不同模型的數據的部分時,我才感覺很好。現在我被卡住了,我的老闆昨天要這樣做。如果可以的話請幫忙。MVC - 提交按鈕不能用於多個部分視圖

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

這裏是我想要做的基本思想是:

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.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的一部分。點擊提交按鈕時,此方法未被擊中。我試過從另一個方法和ModelContract和ModelApplication(及其各種組合)中包含字符串ID變量,但我無法調用此方法。

 [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"); 
    } 
+0

難道CreateContract的POST版本工作之前?我猜想答案是否定的。它可能需要採用ModelContract的一個實例,以便從表單中獲取詳細信息。 – 2014-10-09 15:28:36

+0

我會改變的第一件事是你的提交控制。我將它作爲一個按鈕而不是輸入。試一試,看看它是否開始調用你的控制器動作。 – Pheonyx 2014-10-09 15:28:59

+0

Pheonyx:當我把它改成一個按鈕,我得到這個錯誤:「傳遞到字典的模型產品類型‘CarmelFinancialWeb.Models.ModelContract’的,但這種字典需要類型的模型項目「CarmelFinancialWeb.Models.ModelApplication 」「。 – boilers222 2014-10-09 15:46:47

回答

13

這裏有很多事情發生在這裏有利於你知道,特別是因爲你是新手。首先,一個視圖只能有一個模型。高層次的原因是它實際上是通過所選模型填充的泛型類來呈現的,因爲它是類型的。您可以使用部分視圖在某種程度上作弊,但您仍然必須獲取模型實例。看起來你試圖通過在你的控制器中創建動作來表示這些部分,但這些都是無用的。他們從未被召喚。 Html.PartialHtml.RenderPartial只會呈現指定的視圖,或者使用與調用視圖相同的模型,默認情況下,或者將對象作爲模型(第二個參數)傳遞給這些方法。它不回到控制器。

在MVC中,有一種叫做「子動作」的東西,你似乎想要在這裏工作。通過使用Html.ActionHtml.RenderAction,您可以在控制器上調用返回部分視圖的操作。有兩件事情在那裏,雖然:

  1. 如果你要返回的局部視圖(而不是一個完整的視圖),那麼你應該[ChildActionOnly]裝飾作用。否則,這些操作會暴露給來自瀏覽器的直接URL訪問,這將僅顯示部分視圖,而無需任何佈局。

  2. 子操作只能用於GET式請求。您無法發佈到子動作。

它實際上是最好的事情就是這樣,只使用兒童的行動來呈現形式的獨立區域,如果形式的那些個別地區將被張貼到不同的位置。以一個組合頁面爲例,您可以同時擁有登錄或註冊概念。您可以使用子操作呈現每個單獨的字段組,但登錄部分應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) 
{ 
    ... 
}