Asp.net mvc MVC可重用控件/部分视图访问所有视图

Asp.net mvc MVC可重用控件/部分视图访问所有视图,asp.net-mvc,Asp.net Mvc,嗨,我是MVC的新手 基本上,我想在webforms术语中,在母版页上创建一个控件,在与之关联的每个页面上呈现,但在MVC中 因此,我认为视图中的视图是最佳选择,因为我需要一个不同于前一个视图的模型和控制器 //模型 public class FilterViewModels { public Int32 CompanyID { get; set; } public Int32 ServiceID { get; set; } public

嗨,我是MVC的新手

基本上,我想在webforms术语中,在母版页上创建一个控件,在与之关联的每个页面上呈现,但在MVC中

因此,我认为视图中的视图是最佳选择,因为我需要一个不同于前一个视图的模型和控制器

//模型

public class FilterViewModels
    {
        public Int32 CompanyID { get; set; }
        public Int32 ServiceID { get; set; }
        public IEnumerable<SelectListItem> Companies { get; set; }
        public IEnumerable<SelectListItem> Services { get; set; }
    }
//子视图

@model SalesSystem.Models.FilterViewModels

@{
    Layout = null;
}

@using (Html.BeginForm("Filter", "Filter"))
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary()

    @Html.DropDownListFor(m => m.CompanyID, Model.Companies)
    @Html.DropDownListFor(m => m.ServiceID, Model.Services)
}
//主要观点

@RenderPage("~/Views/Filter/Filter.cshtml");
但是当我运行这个示例时,我得到了一个错误: “对象引用未设置为对象的实例”

视图在实际视图中正确渲染,但不是从主视图渲染,因为它没有运行子视图控制器


这是我试图实现的错误方式吗?

嗨,据我所知,您遇到了以下错误:“对象引用未设置为对象的实例”,因为查看页面需要模型,但未传递。因此,解决方案是如下更改代码

@RenderPage(“~/Views/Filter/Filter.cshtml”,新的{FilterData=Model})

在Filter.cshtml中,您可以使用page属性访问数据

Ex:

@Page.FilterData.CompanyID

有用链接:

其他信息:

也可以使用以下代码调用局部视图:

@Html.Partial("~/Views/Filter/Filter.cshtml", Model)
或者,如果要从视图调用操作方法:

@Html.Action("action", "controller", parameters)
希望以上信息对您有所帮助

谢谢


Karthik

您正在尝试将两个查询合并到一个viewmodel中。我建议使用dynamic
ExpandoObject
将两个查询合并到一个对象中。这样可以防止为所有查询或模型组合创建viewmodel

您可以在所需视图中使用
Html.RenderAction(“Filter”、“YourController”)
调用局部视图,您可以使用如下方式

//控制器

public ActionResult Filter()
{
   var listCompany = db.Companies.Select(c => new SelectListItem
   {
        Value = c.CompanyID,
        Text = c.Company
   }).ToList();

   var listService = db.Services.Select(c => new SelectListItem
   {
       Value = c.ServiceID,
       Text = c.Service
   }).ToList();

   dynamic yourmodel = new ExpandoObject(); 
   yourmodel.Companies = listCompany;
   yourmodel.Services  = listService;

   return View(yourmodel);


}
//过滤器视图

@using SalesSystem; // Your Project Name 
@model dynamic

@{
    Layout = null;
}

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary()

    @Html.DropDownListFor(m => m.Value, new SelectList(Model.Companies, "Value", "Text"))
    @Html.DropDownListFor(m => m.Value, new SelectList(Model.Services, "Value", "Text"))
}
@Html.RenderAction("Filter", "YourController")
//所需视图

@using SalesSystem; // Your Project Name 
@model dynamic

@{
    Layout = null;
}

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary()

    @Html.DropDownListFor(m => m.Value, new SelectList(Model.Companies, "Value", "Text"))
    @Html.DropDownListFor(m => m.Value, new SelectList(Model.Services, "Value", "Text"))
}
@Html.RenderAction("Filter", "YourController")

您需要检查基本Asp.NETMVC的此链接:查看MVC布局页面。这就像ASP.NET web表单中的母版页一样。@Laxman Gite谢谢,我来看看project@Wheels73但是布局没有控制器来传递填充的模型类。至少我是这样理解的it@Anarchy101-您也可以使用Html.RenderAction(“YourAction”、“YourController”)并返回PartialViewResultThank这非常有用,但不是我问题的答案。轮子73给了我动力solution@Anarchy101欢迎:)我已经用Html.RenderAction(“过滤器”,“你的控制器”)更新了我的答案