簡體   English   中英

需要將Viewbag和TemplateInfo傳遞到MVC中的部分視圖

[英]Need to pass Viewbag and TemplateInfo to partial view in MVC

因此,如何將Viewbag數據傳遞到部分視圖的問題已在這里得到了多次回答,但是我需要將Viewbag信息和TemplateInfo傳遞到我的部分視圖,而我找不到解決該問題的單個問題。 我的控制器的一部分看起來像這樣。

<div>
    @{Html.RenderPartial("AboutActivity", (Transport.Models.Tracking.TravelRequest.AboutActivityModel)Model,
              new ViewDataDictionary { TemplateInfo = new TemplateInfo { HtmlFieldPrefix = "AboutActivity" } });}
</div>

這樣可以很好地將對象映射回模型以及所有對象,但是我有一些視圖需要從ViewBag數據中加載下拉列表。

@Html.DropDownList("Destination.State", (IEnumerable<SelectListItem>)ViewBag.States)

如何將ViewBag數據和TemplateInfo前綴傳遞給它。

您無需將ViewBag數據從主視圖顯式傳遞到局部視圖。 只要您可以在主視圖中使用它( 這意味着您在GET操作中設置了ViewBag數據 ),它在部分視圖中也將可用。

public ActionResult Index()
{
   var states = new List<SelectListItem>
   {
        new SelectListItem {Value = "MI", Text = "MI"},
        new SelectListItem {Value = "OH", Text = "MOH"}           
   };
   ViewBag.States = states;
   return view();
}

在索引和從索引視圖中調用的局部視圖中,可以訪問ViewBag.States。

索引檢視

@Html.DropDownList("Destination.State", (IEnumerable<SelectListItem>)ViewBag.States)
<div>
    @{ Html.RenderPartial("AboutActivity"); }
</div>

部分視圖(AboutActivity

<h2>My PartialView</h2>
@Html.DropDownList("Destination.State", (IEnumerable<SelectListItem>)ViewBag.States)

更好的解決方案是不要使用諸如ViewBag和ViewData之類的動態內容在動作方法和視圖之間傳遞數據。 為什么不將新屬性添加到下拉列表數據類型為List<SelectListItem>視圖模型中並使用它呢?

public class AboutActivityViewModel
{
  public List<SelectListItem> States {set;get;}
  public int SelectedState {set;get;}    
  // Other properties for the view as needed
}

public ActionResult Index()
{
   var vm = new AboutActivityViewModel();
   vm.States = new List<SelectListItem>
   {
        new SelectListItem {Value = "MI", Text = "MI"},
        new SelectListItem {Value = "OH", Text = "MOH"}           
   };      
   return view(vm);
}

和您的視圖,它被強類型為AboutActivityViewModel

@model AboutActivityViewModel
<div>
    @{ Html.RenderPartial("AboutActivity"); }
</div>

並且在您的Partial視圖中,它也是強類型的。

@model AboutActivityViewModel     
@Html.DropDownListFor(f => f.SelectedState, Model.States)

如果沒有將模型顯式傳遞給部分視圖,它將使用從其調用的父頁面的模型。

在您的情況下,您要將一個全新的ViewDataDictionary傳遞給該部分,它將覆蓋您之前設置給ViewBag的狀態。 因此,您應確保從現有的ViewBag中讀取狀態,並將其設置為要傳遞的新ViewDataDictionary

<div>

    @{ Html.RenderPartial("AboutActivity", Model, new ViewDataDictionary
        {
            TemplateInfo = new TemplateInfo { HtmlFieldPrefix = "AboutActivity" },
            ["States"] = ViewBag.States
        });
     }
</div>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM