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

Asp.net mvc Net MVC 5如何将ViewBag发送到部分视图,asp.net-mvc,asp.net-mvc-5,Asp.net Mvc,Asp.net Mvc 5,我有一个_LoginPartial视图,希望通过ViewBag向其发送数据,但我发送数据的控制器没有视图 public PartialViewResult Index() { ViewBag.sth = // some data return PartialView("~/Views/Shared/_LoginPartial.cshtml"); } 此代码不适用于我。您始终可以将数据直接传递到局部视图 public PartialViewResu

我有一个_LoginPartial视图,希望通过ViewBag向其发送数据,但我发送数据的控制器没有视图

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

此代码不适用于我。

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

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);
}

首先,问题中的代码不会运行。当您执行
@Html.Partial(“\u SomeView”)
时,那里的Index()方法不会运行。所有
@Html.Partial(“\u SomeView”)
都是使用当前视图的ViewContext在当前视图中呈现
\u SomeView.cshtml

为了让它工作,您需要一点项目中所有控制器通用的功能。您有两个选项:用于
ControllerBase
的扩展方法或项目中所有控制器继承自的
BaseController

扩展方法:

助手:

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

BaseController

控制器:

public class BaseController : Controller
{
    public string GetCommonStuff()
    {
        // do stuff you need here
    }
}
其他控制器:

public class SomeController : BaseController
...
...
视图:


似乎您希望在执行以下操作时调用此
索引
操作:
@Html.Partial(“\u LoginPartial”)
。这永远不会发生
Partial
只需使用当前视图的上下文通过Razor运行部分视图,并输出生成的HTML

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

@Html.Partial("_LoginPartial", new ViewDataDictionary { Foo = "Bar" });
然后,您可以通过以下方式在部分中访问:

ViewData["Foo"]
您还可以使用子操作,如果使用不需要主视图上下文的局部视图,通常更可取
\u LoginPartial
似乎是一个很好的候选者,尽管我不确定您到底是如何使用它的。然而,具有讽刺意味的是,带有单个auth的默认MVC项目附带的
\u LoginPartial
视图使用子操作

基本上,您的代码已经可以使用了,您只需要通过使用
Html.Action
而不是
Html.Partial
来更改引用它的方式:

@Html.Action("Index")

请注意,您在这里调用操作,现在调用视图。

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

下面给出了我的代码示例

 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;
            }

        }
公共异步任务GetJobCreationPartialView(int-id)
{
尝试
{
var客户端=新的ApiClient(“ServiceRepairInspection/GetById”);
var resultdata=wait client.Find(id);
var client2=新的ApiClient(“部分/获取活动”);
var partData=await client2.FindAll();
var list=partData作为列表??partData.ToList();
ViewBag.Part=list.Select(x=>newselectListItem(){Text=x.PartName,Value=x.Id.ToString()});
返回PartialView(“\u CreateJobCardView”,resultdata);
}
捕获(例外)
{
投掷;
}
}

在这里,我已经通过了模型和视图包。

您是否在
\u LoginPartial
视图中访问了
@viewBag.sth
?这将创建一个模型并将其传递到局部视图。使用
ViewBag
不是最好的做法。您到底是如何使用此PartialViewResult的?您建议如何替代PartialViewResult?@CanTunç我需要知道您在何处以及如何使用它来建议替代方案。是否在另一个视图中渲染?它是否正在另一个控制器操作中呈现?您是通过AJAX获得的吗?是否可以发送多个数据?在问题的上下文中,答案是不正确的。确实,您可以使用模型传递数据。但问题是如何在数据库中传递数据Viewbag@kumarharsh使用
ViewBag
本质上是不好的做法,尤其是在传递“多个数据”时。无需向下投票。@trailmax我同意你的建议,但问题是在Viewbag中设置数据,而不是在模型中传递数据。这是因为它不是这个问题的解决方案。如果是一个如何在视图中传递数据的问题,请同意上述解决方案above@kumarharsh同样,请阅读-1直接从视图调用控制器方法绝对不是使用任何MVC框架的正确方法。请不要向我推荐这个people@ZolaKt这很公平。你能告诉我你将如何解决这个用户的问题吗?可能有一百万个解决办法,但我同意大多数人在评论其他答案时所说的。使用ViewBag通常不是一个好主意。制作ViewModel并将其作为模型传递,不要使用ViewBag和/或ViewData。它们是微软虚构的概念,不应该存在于任何干净的MVC框架中,更不应该存在于像.NET这样的强类型框架中。如果您不想重复代码,您可以始终创建一个基本控制器和一个基本视图模型,并在基本控制器中填充“公共”内容如果使用ViewBag/ViewData不会破坏使用C#等强类型语言的最大优势,这就是重构。也就是说,你可以简单地找到某个属性的所有引用,重命名它或其他任何东西。。。使用ViewBags“查找引用”的唯一方法是通过属性名比较,这显然会导致问题。即使是重弹手也经常和他们迷路。如果你想要“到处都是动态”,那么使用.NET是毫无意义的,你只是在“向风车倾斜”。现在有很多很好的动态语言可用。这对我来说是有用的
@Html.Partial(_LoginPartial),new ViewDataDictionary{{“Foo”,“Bar”},{“Foo2”,“Bar2”})
@Html.Action("Index")
 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;
            }

        }