2013-06-18 68 views
0

警告:這是我的第一個網絡應用程序。適當的POST數據方式MVC

我有4個模型,視圖和控制器。讓我們稱他們爲A,B,C,D(例如ModelA,ControllerA,ViewA)。他們都是基本的觀點,並帶有腳手架。

/ControllerA/Index 

用戶開始於ViewA並且選擇第一項,其中用戶重定向到ViewB

/ControllerB/Function?Aid=1 

ViewB示出了基於從選擇另一個ViewA列表。然後用戶選擇再次被重定向到ViewC

/ControllerC/Function?Aid=1&Bid=2 

ViewC顯示基於來自ViewA和ViewB的選擇的另一個列表。然後用戶選擇再次被重定向到ViewD。

/ControllerD/Function?Aid=1&Bid=2&Cid=3 

ViewD顯示了基於ViewA,ViewB和ViewC中的選擇的另一個列表,然後用戶再次選擇。

在這一點上,我想發佈援助,投標,CID和Did並將它們保存在我的數據庫中。理想情況下,用戶將點擊鏈接,數據將被髮布,然後該網站會將用戶重定向回主頁。我應該創建另一個模型和控制器來處理帖子嗎?我想過試圖從controllerD執行POST,但這看起來並不像這樣做的正確方式。

msdn教程僅顯示直接從強類型模型的視圖中發佈。我有點卡住了,我寧願不要把它弄成一團糟。

編輯的代碼 控制器

public ActionResult myFunction(int Aid = 0, int Bid, int Cid) 
     { 

      //query D stuff here 


      if (D == null) 
      { 
       return HttpNotFound(); 
      } 
      return View(D.ToList()); 



     } 

     [HttpPost] 
     [InitializeSimpleMembership] 
     public ActionResult CreateQuote(int Aid, int Bid, int Cid, int Did) 
     { 
      Quote myQuote = new Quote(); 
      myQuote.Customer_ID_FK = (int)Membership.GetUser().ProviderUserKey; 
      myQuote.A_ID_FK = Aid; 
      myQuote.B_ID_FK = Bid; 
      myQuote.C_ID_FK = Cid; 
      myQuote.D_ID_FK = Did; 

      if (ModelState.IsValid) 
      { 
       db.Quotes.Add(myQuote); 
       db.SaveChanges(); 
       db.Quotes.Max(); 
       int mymax = db.Quotes.Max(q => q.ID); 


       return RedirectToAction(); 

      } 


      return View(D.ToList()); 
     } 
     [HttpPost] 
     [InitializeSimpleMembership] 
     public ActionResult CreateQuote(Quote myQuote) 
     { 
      myQuote.Customer_ID_FK = (int)Membership.GetUser().ProviderUserKey; 
      if (ModelState.IsValid) 
      { 

       db.Quotes.Max(); 
       int mymax = db.Quotes.Max(q => q.ID); 
       db.Quotes.Add(myQuote); 
       db.SaveChanges(); 

       return RedirectToAction(); 

      } 

      return View(D.ToList()); 
     } 

回答

1

它通常是有意義的把您的文章在處理它的相關的控制器。情況並非總是如此,因爲有時候讓一個新的控制器處理與某個任務相關的所有帖子會更有意義。您還應該瞭解控制器中的方法與控制器之間的區別。控制器只是一個繼承自System.Web.Mvc.Controller的類,並且可以像其他任何類一樣擁有方法。一個完全合理的控制器可能看起來像這樣:

public class DController : Controller 
{ 

    //GET /d 
    public ActionResult Index() 
    { 
     //MyModel is a class that would contain the logic to display 
     //the selections from A, B, and C 
     var model = new MyModel(); 
     return View(model); 
    } 

    //POST /d/saveresults 
    //We only want this method to accept POST 
    [HttpPost] 
    public ActionResult SaveResults(MyEntity data) 
    { 
     var model = new MyModel(); 
     model.SaveResultsToDatabase(data); 

     return Redirect("/"); 
    } 
} 

控制器中最重要的事情是保持邏輯處理最小化。 if語句在這裏和那裏都沒有錯,但是大部分邏輯應該由您的模型來處理。控制器主要用於在視圖和模型之間傳遞數據。

+0

如何在視圖中創建SaveResults鏈接?我無法弄清楚如何將'Aid,Bid,Cid和Did'變成一個對象(在你的例子中是MyEntity),這樣我就可以發佈它了。我的視圖已經使用ModelD,我可以添加第二個模型到視圖? – Calidus

+0

有不同的處理策略。最簡單/最基本的方法是將要發送到服務器的數據放在

中。 MVC將採用POST參數,並嘗試將它們解析到您指定的對象中。在開始POST之前,您不需要明確地進行任何轉換。在更復雜的情況下,你很可能將你的對象解析爲JSON,然後將JSON發送到服務器 – Jedediah

+0

感謝您的幫助,您的答案和對http的學習更多一點,我想我終於明白了。 – Calidus