2012-08-01 67 views
0

在此項目上工作,我再次卡住。我認爲我需要在旁邊顯示一個菜單。菜單從桌子上拉出來。在這一邊,我有一個問題,從另一個表中拉出來。在這裏面,會有另外一些表格提出的建議。有了這個問題,我有幾個輸入,單選按鈕和一個用於反饋的文本框,它們將以不同的表格結尾。所有這些都必須使用主表中的ID來進行,這樣當信息保存在結果表中時,它就知道它所屬的主記錄是什麼。該頁面可以帶有/ Audit/302,但是當您將子菜單更改爲下一個問題時,您如何獲得該問題並維護該ID。對於每個問題,都會有一個該ID的條目。我已經建立了關係,這就是它的樣子。 Relationships在一個視圖中具有ID的多個模型

2011年8月2日

我也補充說,拉複選框從表中調用分數列表的視圖模型(OK,關注,N/A)

,我有呈現與頁面它從AuditSchedules中提取記錄並檢索一些信息。在佈局中,我還有一個側面菜單(部分),它呈現一系列將選擇不同部分和MainQuestion(部分)的動作鏈接。我們正在努力達到這一點。由於我添加了viewModel來填充複選框,並將文本保存到AuditSchedule和MainQuestion的ID中。我的問題是我打電話給ID來從表中選擇分數的ID,它是從AuditSchedule中獲取ID。給我一個沒有找到的數據。 這裏是我的控制器:

 //get 
    public ActionResult _Forms(int score) 
    { 
     AuditFormEdit viewModel = new AuditFormEdit(); 
     viewModel.ScoreInstance = _db.Scores.Single(r => r.ScoreID == score); 
     viewModel.InitializeScoreCheckBoxHelperList(_db.Scores.ToList()); 
     return View(viewModel); 
    } 

    //post 
    [HttpPost] 
    public ActionResult _Forms(int score, AuditFormEdit viewModel) 
    { 
     if (ModelState.IsValid) 
     { 
      viewModel.PopulateCheckBoxsToScores(); 
      _db.Entry(viewModel.ScoreInstance).State = System.Data.EntityState.Modified; 
      _db.SaveChanges(); 
      return RedirectToAction("/"); 
     } 
     else 
     { 
      return View(viewModel); 
     } 
    } 

這裏是我的ViewModel:

public class AuditFormEdit 
{ 
    public Models.Score ScoreInstance { get; set; } 

    public List<ScoreCardCheckBoxHelper> ScoreCardCheckBoxHelperList { get; set; } 

    public void InitializeScoreCheckBoxHelperList(List<Models.Score> ScoreList) 
    { 
     if (this.ScoreCardCheckBoxHelperList == null) 
      this.ScoreCardCheckBoxHelperList = new List<ScoreCardCheckBoxHelper>(); 

     if (ScoreList != null 
      && this.ScoreInstance != null) 
     { 
      this.ScoreCardCheckBoxHelperList.Clear(); 
      ScoreCardCheckBoxHelper spacerProductCheckBoxHelper; 
      string spacerTypes = 
       string.IsNullOrEmpty(this.ScoreInstance.ScoreName) ? 
       string.Empty : this.ScoreInstance.ScoreName; 
      foreach (Models.Score scoreType in ScoreList) 
      { 
       spacerProductCheckBoxHelper = new ScoreCardCheckBoxHelper(scoreType); 
       if (spacerTypes.Contains(scoreType.ScoreName)) 
        spacerProductCheckBoxHelper.Checked = true; 
       this.ScoreCardCheckBoxHelperList.Add(spacerProductCheckBoxHelper); 
      } 
     } 
    } 

    public void PopulateCheckBoxsToScores() 
    { 
     this.ScoreInstance.ScoreName = string.Empty; 
     var scoreType = this.ScoreCardCheckBoxHelperList.Where(x => x.Checked) 
           .Select<ScoreCardCheckBoxHelper, string>(x => x.ScoreName) 
           .AsEnumerable(); 
     this.ScoreInstance.ScoreName = string.Join(", ", scoreType); 
    } 


    public class ScoreCardCheckBoxHelper : Models.Score 
    { 
     public bool Checked { get; set; } 

     public ScoreCardCheckBoxHelper() : base() { } 

     public ScoreCardCheckBoxHelper(Models.Score scoreCard) 
     { 
      this.ScoreID = scoreCard.ScoreID; 
      this.ScoreName = scoreCard.ScoreName; 
     } 
    } 

} 

這裏是鏈接和控制器,拉向上翻頁,這是佈局的身體:

 public ActionResult Audit(int id) 
    { 
     var auditToDetail = _db.AuditSchedules.Single(r => r.AuditScheduleID == id); 
     return View(auditToDetail); 
    } 

鏈接看起來像這樣:

/AuditSchedule/Audit/257 

讓我知道你是否需要別的東西。

我已經使用了代碼優先的方法,並且所有的表格都有模型,其中的關係稱爲out。

謝謝

+1

什麼是你的問題?你嘗試過什麼嗎?你有沒有嘗試寫一些代碼?您是否遇到過我們可以在此討論的代碼的一些特定問題? – 2012-08-01 16:41:11

+0

我的問題是我如何填充這個視圖保持這個ID。不,我沒有保留我嘗試過的任何東西,因爲我真的不知道從哪裏開始。我是一名PHP程序員,這是我第一個C#MVC項目。 – 2012-08-01 16:44:50

+0

如果你不知道從哪裏開始使用ASP.NET MVC,我會在這裏推薦你:http://asp.net/mvc。然後,當以後你有什麼我們可以討論的時候,不要猶豫,回到這裏問一些更具體的問題。 – 2012-08-01 16:49:43

回答

0

你的問題是相當普遍的 - 但這裏有一些事情要考慮。

首先,在MVC3中,您通常希望強烈地將視圖輸入到模型中。在你的情況下,你會想要每個模型的單一視圖。您不希望「視圖中存在多個多個模型」,而是希望在單個頁面上一起呈現多個視圖 - 所有視圖都由一些常見數據鏈接。

完成此操作的一種方法是在控制器中設置一個「子動作」(使用:[ChildActionOnly]屬性),以填充每個模型,並將它們發送到它們各自的獨立視圖。您可以在任何視圖中使用[Html.RenderAction] [3]函數來渲染任何其他視圖。組織這種工作的最簡單方法通常是佈局4 - 您可以使用Html.RenderAction()渲染所有視圖,然後將主窗體渲染爲主視圖(在佈局中使用@RenderBody()顯示)。

要填充每個你的模型可能需要知道的一些數據(如一個id),這些可以被存儲在ViewBag或ViewData的,並通過在作爲Html.RenderAction函數對象。 (如果您使用的剃刀視圖中的調用可能看起來像:@{Html.RenderAction("actionName", new {object1 = "xyz", object2 ="abc"});}只是爲了明確這一點,邏輯流將看起來像這樣

  1. 你需要渲染你的子數據填充ViewBag意見,
  2. 填充您的主表單模型,並調用主窗體的視圖(主視圖)。
  3. 您的主視圖定義佈局圖,後者又調用Html.RenderAction,使用ViewBag數據設置
  4. 佈局還將主視圖渲染爲「主體」(@RenderBody())。

這樣做的最終結果是可以對各個視圖[強類型] [7]以及每個模型的單獨控制器操作的視圖。這是一件好事,因爲它使您的視圖可以在任何地方重用,並且它隔離了填充每個模型的邏輯(因爲每個模型在控制器中都有自己的操作)。如果您對模型進行後續更改,將很容易知道需要修改哪個動作/模型/視圖。

以下是一些資源,可幫助您瞭解在單個頁面上呈現多個模型的選項。我很抱歉不把這篇文章與有用的項目鏈接起來,但作爲一個新的回覆者,我只限於兩個人...... Google必須成爲你的指南。

希望這會有所幫助 - 祝您好運!

資源:

Html.RenderAction and Html.Action - http://haacked.com blog

When to use Html.RenderPartial and Html.RenderAction in ASP.NET MVC Razor Views - http://www.arrangeactassert.com

+0

謝謝。我已經到了那個地步了!我有一個佈局,填充1視圖和2部分視圖。我使用@Html.Action來填充部分。它是給我的錯誤,因爲字典類型可能會有所不同。無論如何,我現在遇到的問題是,我的模型查看它的寫方式使用表中的ID,它不會以這種方式工作,因爲這是進入一個空表。所以我需要使用正確的ID來編寫新記錄 – 2012-08-02 19:25:09

+0

很高興聽到視圖正常工作(字典錯誤與使用「部分視圖」與「視圖」有關 - 您可以通過將它們組織爲偏分量來避免它)。我還有另一個想法 - 您可能想考慮客戶端AJAX來填充/重新填充各種視圖。這樣,如果您在一個視圖中進行選擇,則可以使用AJAX響應重新加載頁面的另一個部分(子視圖),並避免重新加載整個頁面。您可以捕獲Request.IsAjax()來決定是返回整個頁面還是僅返回子視圖。您隨時都可以進行升級。 – christophersw 2012-08-02 22:19:41

相關問題