所有视图中的MVC可重用控件/部分视图

时间:2017-06-21 12:31:23

标签: asp.net-mvc

嗨,我对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; }
    }

//控制器

public ActionResult Filter()
        {
            var query = db.Companies.Select(c => new SelectListItem
            {
                Value = c.CompanyID.ToString(),
                Text = c.Company
                //,Selected = c.CompanyID.Equals(3)
            });

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

            var model = new FilterViewModels
            {
                Companies = query.AsEnumerable(),
                Services = query1.AsEnumerable()
            };

            return View(model);
        }

//子视图

@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");

但是当我运行这个例子时,我得到了错误: &#34;对象引用未设置为对象的实例&#34;

视图在实际视图中正确呈现,但不能从主视图中呈现,因为它不运行子视图控制器。

这是否是我想要完成的事情的错误方式?

2 个答案:

答案 0 :(得分:1)

您正尝试在一个viewmodel中组合两个查询。我建议使用动态onChange在一个对象中组合两个查询。这样可以防止为所有查询或模型组合创建视图模型。

您可以在所需视图中使用ExpandoObject调用部分视图,您可以像以下一样使用此方式。

<强> //控制器

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

答案 1 :(得分:-1)

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

@RenderPage(“〜/ Views / Filter / Filter.cshtml”,new {FilterData = Model});

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

<强>实施例

@ Page.FilterData.CompanyID

有用的链接: http://www.dotnetcurry.com/ShowArticle.aspx?ID=646

其他信息:

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

@Html.Partial("~/Views/Filter/Filter.cshtml", Model)

或者,如果您想从视图中调用操作方法:

@Html.Action("action", "controller", parameters)

希望以上信息有用

由于

KARTHIK