我如何在我的asp.net mvc Web应用程序中创建一个可以接受不同类型对象的共享局部视图

时间:2016-06-07 14:05:11

标签: c# asp.net asp.net-mvc asp.net-mvc-4 object-oriented-analysis

我正在开发一个asp.net MVC Web应用程序。我有很多模型类,它们代表服务器,虚拟机,PC,监视器等。对于这些模型类中的每一个,都有一个用于填充的共享类第三方API。所以我使用共享类扩展了所有模型类,如下所示: -

 public class Server : CreateResource,  IValidatableObject
    {//code goes here}

 public class VM : CreateResource,  IValidatableObject
    {//code goes here}
 public class PC : CreateResource,  IValidatableObject
    {//code goes here}

这里是CreateResource类: -

public class CreateResource
    {
        public CreateResource()
        {
            this.operation = new Operation5();
            this.createAccount = new CreateAccount();
        }
        public Operation5 operation { get; set; }
        public CreateAccount createAccount { get; set; }

    }

现在我面临的问题是,对于所有模型类,我将在创建server,vm,pc对象时使用精确视图输入CreateResource数据。所以在服务器,vm,pc等主创建/编辑视图中,我添加了对部分视图的引用,如下所示(这是Server对象的一个​​例子): -

@model S.Models.Server

@Html.Partial("_PMCreateResource",Model.operation.Details)
    @Html.Partial("_PMCreateAccount",Model.createAccount.operation.Details.ACCOUNTLIST.ToList())

但我遇到的问题是,当视图回发到创建/编辑操作方法时,我必须定义单独的参数来访问回发模型(一个主模型和两个代表部分视图的模型)如下(这是服务器操作方法的示例): -

[HttpPost]       
[ValidateAntiForgeryToken]
public ActionResult Create(Server sj,Details4 d4,List<ACCOUNTLIST> al)
{

并且只能定义Server对象如下: -

[HttpPost]       
[ValidateAntiForgeryToken]
public ActionResult Create(Server sj)
{

然后我将需要将整个模型传递给部分视图,如下所示(这是服务器主视图的一个示例): -

@model S.Models.Server

@Html.Partial("_PMCreateResource",Model)
@Html.Partial("_PMCreateAccount",Model)

但是将整个服务器,vm,pc,监控模型传递到相同的局部视图意味着我必须为每个模型类创建单独的局部视图,因为每个局部视图将接受不同的模型对象。所以不确定我是否可以修改我的代码来实现这两件事: -

  1. 将整个模型对象传递给局部视图。因此,当回发视图时,post动作方法只接受一个模型对象作为参数,而不是3个参数。
  2. 使用单个共享视图,它将接受不同类型的模型对象?
  3. 不确定我怎么能做到这一点?

1 个答案:

答案 0 :(得分:1)

请勿使用@HtmlPartial(),请使用EditorTemplate,以便正确地为控件的name属性添加前缀。

CreateResource.cshtml文件夹中创建名为/Views/Shared/EditorTemplates的部分视图(请注意,文件名必须与班级名称相匹配)

@model CreateResource
@Html.TextboxFor(m => m.operation.Details.SomeProperty)
....
for(int i = 0; i < Model.createAccount.operation.Details.ACCOUNTLIST.Count; i++)
{
    @Html.TextBoxFor(m => m.createAccount.operation.Details.ACCOUNTLIST[i].SomeProperty)
    ....
}

然后在主视图中

@model S.Models.Server
Html.EditorFor(m => m) // generated the base controls
.... // controls specific to Server

然后将EditorTemplate分解为更易于管理的部分并允许您重复使用它们,为Operation5CreateAccount创建其他模板

/Views/Shared/EditorTemplates/Operation5.cshtml

@model Operation5
@Html.TextBoxFor(m => m.Details.SomeProperty)
....

并将CreateResource.cshtml模板更改为

@model CreateResource
@Html.EditorFor(m => m.operation)
@Html.EditorFor(m => m.createAccount)

并且您可以继续将其分解为每个嵌套模型创建EditorTemplate,包括集合项,因此假设属性Details是type Detail和属性{{1} }是typeof ACCOUNTLIST,那么你会有

List<AccountItem>

/Views/Shared/EditorTemplates/AccountItem.cshtml

@model AccountItem @Html.TextBoxFor(m => m.SomeProperty)

/Views/Shared/EditorTemplates/Detail.cshtml