我有一个_LoginPartial视图,希望通过ViewBag向其发送数据,但我发送数据的控制器没有视图。
public PartialViewResult Index()
{
ViewBag.sth = // some data
return PartialView("~/Views/Shared/_LoginPartial.cshtml");
}
这段代码对我没有用。
我有一个_LoginPartial视图,希望通过ViewBag向其发送数据,但我发送数据的控制器没有视图。
public PartialViewResult Index()
{
ViewBag.sth = // some data
return PartialView("~/Views/Shared/_LoginPartial.cshtml");
}
@Html.Partial('_LoginPartial')
时会调用此Index
操作。这是不可能发生的。Partial
只是将局部视图通过Razor 与当前视图上下文一起运行并输出生成的HTML。ViewDataDictionary
。@Html.Partial("_LoginPartial", new ViewDataDictionary { Foo = "Bar" });
然后你可以通过以下方式在partial中访问:
ViewData["Foo"]
_LoginPartial
看起来是一个很好的候选项,尽管我不确定您如何使用它。然而,具有单独身份验证的默认MVC项目使用子操作的 _LoginPartial
视图。
基本上,您已经拥有的代码已经可以工作,您只需要更改如何引用它,改为使用 Html.Action
而不是 Html.Partial
:
@Html.Action("Index")
@Html.Partial("_LoginPartial", new ViewDataDictionary {{"Foo ", "Bar"}, {"Foo2", "Bar2"}})
。 - Nerdroid您可以直接将数据传递给局部视图。
public PartialViewResult Index()
{
var data = // some data
return PartialView("~/Views/Shared/_LoginPartial.cshtml", data);
}
传递多个数据(pieces of 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);
}
public async Task<ActionResult> GetJobCreationPartialView(int id)
{
try
{
var client = new ApiClient<ServiceRepairInspectionViewModel>("ServiceRepairInspection/GetById");
var resultdata = await client.Find(id);
var client2 = new ApiClient<PartViewModel>("Part/GetActive");
var partData = await client2.FindAll();
var list = partData as List<PartViewModel> ?? partData.ToList();
ViewBag.Part = list.Select(x => new SelectListItem() {Text = x.PartName, Value = x.Id.ToString()});
return PartialView("_CreateJobCardView" ,resultdata);
}
catch (Exception)
{
throw;
}
}
这里我已经传递了模型和视图数据。
首先,你提供的代码无法运行。当你使用@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()
基础控制器
控制器:
public class BaseController : Controller
{
public string GetCommonStuff()
{
// do stuff you need here
}
}
其他控制器:
public class SomeController : BaseController
...
...
视图:
@((ViewContext.Controller as BaseController).GetCommonStuff())
_LoginPartial
视图中访问了@ViewBag.sth
吗?这应该可以工作。 - trailmaxViewBag
不是最佳实践。 - trailmax