嗨,我对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;
视图在实际视图中正确呈现,但不能从主视图中呈现,因为它不运行子视图控制器。
这是否是我想要完成的事情的错误方式?
答案 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