Asp.Net MVC 5如何将ViewBag发送到部分视图

时间:2014-08-14 14:37:39

标签: asp.net-mvc asp.net-mvc-5

我有一个_LoginPartial View,想要通过ViewBag向它发送数据,但我发送数据的Controller没有View。

public PartialViewResult Index()
    {
        ViewBag.sth = // some data
        return PartialView("~/Views/Shared/_LoginPartial.cshtml");
    }

此代码对我不起作用。

4 个答案:

答案 0 :(得分:8)

您执行以下操作时似乎希望调用此Index操作:@Html.Partial('_LoginPartial')。这永远不会发生。 Partial只使用当前视图的上下文通过Razor 运行部分视图,并吐出生成的HTML。

如果您需要部分的其他信息,可以指定自定义ViewDataDictionary

@Html.Partial("_LoginPartial", new ViewDataDictionary { Foo = "Bar" });

然后您可以在部分途径中访问:

ViewData["Foo"]

您还可以使用子操作,如果使用不需要主视图上下文的局部视图,通常更可取。 _LoginPartial似乎是一个很好的候选人,虽然我不确定你是如何使用它的。但具有讽刺意味的是,带有单独身份验证的默认MVC项目附带的_LoginPartial视图使用子操作。

基本上,您拥有的代码已经可以使用,您只需要使用Html.Action代替Html.Partial来更改引用代码:

@Html.Action("Index")

请注意,您在此处调用操作,现在调用视图。

答案 1 :(得分:0)

您始终可以将数据直接传递到局部视图。

public PartialViewResult Index()
{
    var data = // some data
    return PartialView("~/Views/Shared/_LoginPartial.cshtml", data);
}

传递多个数据

public class MyModel
{
    public int Prop1 { get; set; }
    public int Prop2 { get; set; }
}

public PartialViewResult Index()
{
    var data = new MyModel(){ Prop1 = 5, Prop2 = 10 };
    return PartialView("~/Views/Shared/_LoginPartial.cshtml", data);
}

答案 2 :(得分:0)

我将viewBag数据传递给我的局部视图,如下所示,我在部分视图中使用@ Html.Raw(Json.Encode(ViewBag.Part))将该viewBag数据对象转换为JSON;

我的代码示例如下。

$location.path('/login');

这里我已经通过了model和viewBag。

答案 3 :(得分:-1)

首先,问题中的代码不会运行。当你执行@Html.Partial("_SomeView") Index()方法时,你没有运行。所有@Html.Partial("_SomeView")使用当前视图的ViewContext在当前视图中渲染_SomeView.cshtml

为了实现这一点,您需要一些项目中所有控制器共有的功能。您有两个选项:ControllerBase的扩展方法或项目中所有控制器都继承的BaseController

扩展方法:

助手:

public static class ControllerExtensions
{
    public static string GetCommonStuff(this ControllerBase ctrl)
    {
        // do stuff you need here
    }
}

查看:

@ViewContext.Controller.GetCommonStuff()

<强> BaseController

控制器:

public class BaseController : Controller
{
    public string GetCommonStuff()
    {
        // do stuff you need here
    }
}

其他管制员:

public class SomeController : BaseController
...
...

查看:

@((ViewContext.Controller as BaseController).GetCommonStuff())