2009-12-19 52 views
0

這是我在ASP.NET MVC真正模型的簡化,我認爲這將有助於集中在問題:麻煩路過視圖和控制器之間的複雜數據在ASP.NET MVC

比方說,我有這兩個域對象:

public class ObjectA 
{ 
    public ObjectB ObjectB; 
} 

public class ObjectB 
{ 
} 

我也有一種觀點認爲,可以讓我創建一個新的對象A和包括從可能ObjectBs列表中選擇一個對象B。

我已經創建了一個新的類來裝飾ObjectA與這個可能性列表,這是我真正的我的視圖模型。現在

public class ObjectAViewModel 
{ 
    public ObjectA ObjectA { get; private set; } 
    public SelectList PossibleSelectionsForObjectB { get; private set; } 

    public ObjectAViewModel(ObjectA objectA, IEnumerable<Location> possibleObjectBs) 
    { 
     ObjectA = objectA; 
     PossibleSelectionsForObjectB = new SelectList(possibleObjectBs, ObjectA.ObjectB); 
    } 
} 

,什麼是構建我的視圖和控制器,以允許用戶在視圖中選擇一個對象B,然後讓控制器保存對象A與對象B的選擇(對象B已經存在,並保存的最佳途徑)?

我試着創建一個類型爲ObjectAViewModel的強類型視圖,並將Html.DropDownList綁定到Model.PossibleSelectionsForObjectB。這很好,我可以很好地選擇對象。但是讓它回到控制器是我掙扎的地方。

嘗試性解決方案1:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create(ObjectAViewModel objectAViewModel) 

這裏這個問題是objectAViewModel.ObjectA.ObjectB屬性爲null。我正在考慮綁定到這個屬性的DropDownList,當用戶在視圖中選擇這個時會更新模型,但這不是由於某種原因。

嘗試性解決方案2:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create(ObjectA objectA) 

這裏這個問題是ObjectA.ObjectB屬性爲null。再次,我想也許DropDownList選擇會更新這個。

我也嘗試在上述每個解決方案中使用UpdateModel方法,但沒有運氣。有沒有人有任何想法?我猜我缺少一個綁定或某處的某個地方...

謝謝!

回答

0

經過一番研究後,它看起來不像是ASP.NET MVC會爲我照顧的情況。也許有一個我可以使用的數據服務綁定模型(因此MVC會根據在下拉列表中選擇的內容自動獲取適當的對象),但現在,我可以通過在控制器中處理它來解決此問題:

  1. 使用Controller.ModelState
  2. 刷新從下拉獲取所選擇的項目的是對象B從基礎數據服務
  3. 分配該對象B到對象A。對象B
  4. 保存對象A

所以我的控制器方法現在看起來是這樣的:

編輯基於從LukLed

[AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Create(ObjectA objectA, string objectBStr) 
    { 
     ObjectB objectB = _objBService.Get(objectBStr); 
     objectA.ObjectB = objectB; 
     _objAService.Save(objectA); 
     return RedirectToAction("Details", new { id = objectA.Id }); 
    } 
+1

你可以改變公衆的ActionResult創建(對象A對象A) 公衆的ActionResult創建(對象A對象A,字符串對象B)。您不必從ModelState獲取值。 – LukLed 2009-12-20 10:18:31

+0

謝謝!我會去做。 – manu08 2009-12-21 23:01:19

1

我使用的代碼如下評論:

[HttpPost] 
    public ActionResult Create([Bind(Exclude = "Id")]ObjectA objectAToCreate) 
    { 
     try 
     { 
      Repository.AddObjectA(objectAToCreate); 
      return RedirectToAction("Details", new { id = objectAToCreate.Id }); 
     } 
     catch 
     { 
      return View(); 
     } 
    } 

Wit在庫(實體框架特定)H下面的代碼:

public void AddObjectA(ObjectA objectAToAdd) 
    { 
     objectAToAdd.ObjectB = GetObjectB(objectAToAdd.ObjectB.Id); 
     _entities.AddToObjectAs(objectAToAdd); 
     _entities.SaveChanges(); 
    } 

    public void GetObjectB(int id) 
    { 
     return _entities.ObjectBs.FirstOrDefault(m => m.id == id); 
    } 

根據您的commments,它基本上是重裝從底層數據服務的對象,但是我沒有找到需要使用的ModelState到訪問嘗試的值。

這是基於沿着這些線路編碼一個觀點:

 <p> 
      <%= Html.LabelFor(f => f.ObjectB.Id) %> 
      <%= Html.DropDownList("ObjectB.Id", new SelectList((IEnumerable)ViewData["ObjectBList"], "Id", "Descriptor"),"") %> 
      <%= Html.ValidationFor(f => f.ObjectB, "*") %> 
     </p> 

注意,這可以改善使用強類型的視圖模型(我相信你已經這樣做了),也創建一個自定義編輯模板對於對象B使得呼叫可以使用進行:

<%= Html.EditorFor(f => f.ObjectB) %> 
相關問題