2017-08-02 41 views
-1

有時您需要將一些額外的數據傳遞給視圖。例如添加新聞頁面中的新聞組,應該從數據庫中檢索。將模型中的額外數據傳遞給查看的最佳實踐?

我知道,在視圖中創建DB-方面的實例是不是這樣做的一個很好的做法。相反,我們可以向視圖模型添加一些屬性,並將這些數據傳遞給視圖或使用View-Bag並對其進行類型轉換,但在這些情況下,您可能需要在HttpGet和HttpPost中編寫一些代碼,在Get和Post方法中返回相同的視圖。

請告訴我做這樣的操作的最佳做​​法是什麼?有沒有另一種方式寫一次?

+0

使用視圖模型(https://stackoverflow.com/questions/14423056/why-do-我們使用-的ViewModels) – Fran

+0

感謝的答案,正如我告訴,我知道如何通過在視圖模型,這些額外的數據,一個視圖模型是什麼,如何以及爲什麼我們應該利用這個視圖模型對業務邏輯之間的分離和UI邏輯。 –

+0

我想知道是否有另一種方式更好地匹配這些情況。 任何其他想法保持視圖模型簡單? –

回答

0

要僅寫入一個組件並在不同視圖中重新使用該組件,請將組件打包到自己的操作中,並使用它自己的ViewModelPartial View

如果它沒有意義,這個動作可以從外部對自己被調用,它的屬性如[ChildActionOnly]。數據庫訪問應該發生在這個子操作中,數據應該使用ViewModel傳遞給View。

渲染使用@Html.Action("{actionName}", "{controllerName}")在需要時通過該操作生成的HTML。

例如:

NewsController包含子行動:

[ChildActionOnly] 
public PartialViewResult ShowNewsGroups(long userId) { 

    var data = // ... read from DB using userId parameter 
    var vm = new ShowNewsGroupsViewModel { 
      GroupInfos = data 
    }; 

    return PartialView("_ShowNewsGroups", vm); 
} 

管窺_ShowNewsGroups.cshtml呈現新聞組:

@model ShowNewsGroupsViewModel 
@for(var i = 0; i < Model.GroupInfos.Count(); i++) { 
    @Html.DisplayFor(m => m.GroupInfos[i]) 
} 

主視圖調用子操作,並傳遞所需的參數:

@Html.Action("ShowNewsGroups", "News", new { userId = Model.UserId })) 
0

對於我們使用視圖模型的概念 其分毫但需要物業

例如,讓只是一個模型這個specifc理由說你有一個模型叫測試,現在你想通過類似的isValid和日期時間的布爾一些額外的屬性創建 所以

您的視圖=模式將

public class YourViewMode 
{ 
public test mainModel{get;set;} 
public bool isValid {get;set;} 
public datetime Created {get;set;} 
} 

現在只是初始化這種模式您認爲這是視圖模型基本上是如何工作的

1

據我所知,你似乎掌握了你需要做的事情,但不喜歡get和post操作之間的代碼重複。爲此,只需將通用代碼分解爲兩種操作都可以調用的控制器上的受保護或私有方法。例如,假設您需要的Foo項目選擇列表:

public class MyViewModel 
{ 
    ... 
    public IEnumerable<SelectListItem> FooOptions { get; set; } 
} 

然後:

public class MyController : Controller 
{ 
    ... 

    private void PopulateFooOptions(MyViewModel model) 
    { 
     var foos = db.Foos.ToList(); 
     model.FooOptions = foos.Select(f => new SelectListItem { Value = f.Id.ToString(), f.Name }); 
    } 

    public ActionResult Create() 
    { 
     var model = new MyViewModel(); 
     PopulateFooOptions(model); 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Create(MyViewModel model) 
    { 
     if (ModelState.IsValid) 
     { 
      // do stuff 
     } 

     PopulateFooOptions(model); 
     return View(model); 
    } 
} 
相關問題