我有一个包含我的表单输入(文本框)的局部视图。我有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并将其强制转换回您的基础。然后,您将拥有所有可用的属性
答案 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中)。