我怎样才能制作我的视图模型

时间:2011-04-17 17:30:49

标签: c# asp.net-mvc asp.net-mvc-3

我有一个包含我的表单输入(文本框)的局部视图。我有2个其他部分视图使用相同的表单。一个用于添加产品,另一个用于编辑产品。

此表单使用视图模型(让我们称之为CoreViewModel)。现在编辑产品还有几个字段,然后添加产品。

我想知道如何添加这些额外字段而不显示添加产品表单?

我无法将这些额外字段添加到编辑产品视图中,它们必须位于CoreViewModel中,否则我认为造型会是一场噩梦。

我在想有一个基类然后进行编辑。我会发送一个继承此基类的视图模型。

在视图中检查View Model是否属于此继承类,而不是基类,如果它不是基类,则呈现代码。

这样我就不会将编辑特定代码粘贴到我的CoreViewModel中,添加视图和编辑视图都可以访问。

我希望这是有道理的。

由于

修改

使用Muhammad Adeel Zahid代码作为我的基础我认为我得到了它的工作

    public class CreateViewModel
    { 
    ......
    ......
    }

    public class EditViewModel:CreateViewModel{
        public string AdditionalProperty1{get;set;}
        public string AdditionalProperty2{get;set;}
    }

Controller

    EditViewModel viewModel = new EditViewModel();
    // add all properties need
    // cast it to base
    return PartialView("MyEditView", (CreateViewModel)viewModel);

View 1

    @Model CreateViewModel
    @using (Html.BeginForm())
    {
        @Html.Partial("Form", Model)
    }

Form View

@Model CreateViewModel
// all properties from CreateView are in here
// try and do a safe case back to an EditViewModel
 @{EditViewModel  edit = Model as EditViewModel ;}

 // if edit is null then must be using this form to create. If it is not null then it is an edit
 @if (edit != null)
 {     // pass in the view model and in this view all specific controls for the edit view will be generated. You will also have intellisense.
       @Html.Partial("EditView",edit)
 }

当您将其发布回“编辑”操作结果时,只需获取EditViewModel并将其强制转换回您的基础。然后,您将拥有所有可用的属性

1 个答案:

答案 0 :(得分:0)

我经常看到人们反对这些事情。他们经常敦促每个视图都有viewmodel(即使是编辑和创建相同实体的视图)。同样,这一切都取决于你在做什么。您可以在编辑时创建不同的数据注释,并为不同的验证需求创建视图,但如果它们相同,我们可能会使用相同的viewmodel进行创建和编辑。为了解决你的情况,我无法找出几个选项。首先,在视图模型中保留一个布尔属性,告诉您它是否是并在视图中编辑或创建并有条件地呈现属性

public class MyViewModel
{
   public string P1{get;set;}
   ....
   public boolean Editing{get;set;}
}

在Create ActionResult中将Editing属性设置为false,在Edit ActionReult中将Edit属性设置为true。这是最简单的方法。第二个有点脏,但你会觉得使用这项技术。您可以使用c#4.0的动态行为。让你的页面继承自页面的iherits指令中的动态(我使用aspx视图引擎)。然后创建一个ViewModel:

public class CreateViewModel
{ 
......
......
}
and one Edit ViewModel
public class EditViewModel:CreateViewModel{
    public string AdditionalProperty1{get;set;}
    public string AdditionalProperty2{get;set;}
}

在您的视图中,您可以执行以下操作:

<%:if(Model.GetType().Name.ToString() == "EditViewModel"){%>
  <%:Html.Textbox("AdditionalProperty1")%>
    <%:Html.Textbox("AdditionalProperty1")%> 
<%}>

动态付出代价。你失去了智能感知,你不能使用强类型助手(至少在asp.net MVC 2中)。