我有一个_LoginPartial View,想要通过ViewBag向它发送数据,但我发送数据的Controller没有View。
public PartialViewResult Index()
{
ViewBag.sth = // some data
return PartialView("~/Views/Shared/_LoginPartial.cshtml");
}
此代码对我不起作用。
答案 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())