2013-07-15 4 views
2

У меня есть одна главная страница, в которой отображается 3 частичного представления и содержит один элемент рендеринга (держатель места размещения) для просмотров.Как передать значение из частичного представления в родительский вид в asp net mvc3

Я пытаюсь передать данные (любую строку) из моего дочернего представления в один из частичных представлений, отображаемых на главной странице. И для этого я использую Viewbag, но он не имеет доступа к родительскому виду.

Мой код ниже:

Мой мастер-страница: [Main_Layout.chtml]

<body> 
    <div> 
     @{Html.RenderAction("Header_PartialView", "Home");} 
    </div> 
    <div> 
     <table cellpadding="0" cellspacing="0" width="100%"> 
      <tr valign="top"> 
       <td id="tdLeft" class="lftPanel_Con"> 
        <div> 
         @{Html.RenderAction("LeftPanel_PartialView", "Home");} 
        </div> 
       </td> 
       <td id="tdRight" width="100%"> 
        <div> 
         @RenderBody() 
        </div> 
       </td> 
      </tr> 
     </table> 
    </div> 
    <!--start footer--> 
    <div> 
     @{Html.RenderAction("Footer_PartialView", "Home");} 
    </div> 
</body> 

Мой ребенок Вид: [TestPage1.chtml]

@{ 
     ViewBag.Title = "TestPage1"; 
     Layout = "~/Views/Shared/Main_LayoutPage.cshtml"; 

     var test1 = ViewBag.testData1; 
     var test2 = ViewData["testData2"]; 

    } 

<h2>TestPage1</h2> 
<div>This is only for testing</div> 

My Controller Код:

public ViewResult TestPage1() 
     { 
      ViewBag.testData1 = "My first view bag data"; 
      ViewData["testData2"] = "My second view data"; 
      return View(); 
     } 

Теперь я хочу получить доступ к данным моего TestPage на Header_PartialView просмотров.

@{ 
    var test = ViewBag.testData1; 
    var test2 = ViewData["testData2"]; 
} 

ответ

5

Для доступа к данным из тестовой страницы в Header_PartialView вы должны передать его в качестве параметра в Html.RenderAction() на Main_LayoutPage.cshtml так:

@{ var test = ViewBag.testData1; } 
@{Html.RenderAction("Header_PartialView", "Home", new { test = test });} 

И в Header_PartialView action добавьте параметр string test и передайте его как модель, потому что ViewBag из макета не приходит ей е.

public ActionResult Header_PartialView(string test) 
{ 
    return View(model: test); 
} 

Тогда на Header_PartialView.cshtml вы получаете код:

@model string 

@{ 
    Layout = null; 
} 
<div>@Model</div> 
1

Попробуйте, как это в вашем парциальное:

@{ 
    var test = ViewContext.ParentActionViewContext.ViewData["testData1"]; 
    var test2 = ViewContext.ParentActionViewContext.ViewData["testData2"]; 
} 
+0

'строка T itlePrefix = (строка) ViewContext.ParentActionViewContext.ViewData ["TitlePrefix"]; ' – ppumkin

1

Я думаю, что лучше использовать HttpContext.Items здесь.

@{ 
    this.ViewContext.HttpContext.Items["Stuff"] = "some-data"; 
} 

Вы можете получить доступ к этим данным во всех представлениях, которые являются рендерингом в запросе. эти данные действительны для одного HTTP-запроса.

Подробнее:

https://msdn.microsoft.com/en-us/library/system.web.httpcontext.items(v=vs.110).aspx

When can we use HttpContext.Current.Items to stores data in ASP.NET?

+0

и в родительском представлении вы можете вызвать, как ViewContext.HttpContext.Items [" stuff "] – Ashutosh

1

Я был в состоянии передать значение просто с помощью

TempData["Msg"]="My Data";

вместо ViewBag.Msg="My Data";

Смежные вопросы