C# 如何创建视图模型
我有一个包含表单输入(文本框)的局部视图。我有另外两个部分视图使用相同的形式。一个用于添加产品,另一个用于编辑产品 此表单使用视图模型(我们称之为CoreViewModel)。现在编辑产品比添加产品有更多的字段 我想知道如何添加这些额外字段,而不让它们显示在add product表单上 我无法将这些额外字段添加到“编辑产品”视图中,它们必须位于CoreViewModel中,否则我认为设置样式将是一场噩梦 我在考虑可能有一个基类,然后进行编辑。我会给它发送一个继承这个基类的视图模型 在视图中检查视图模型是否属于此继承类而不是基类,如果它不是基类,则渲染代码 这样,我就不会将特定于编辑的代码粘贴到添加视图和编辑视图都可以访问的CoreViewModel中 我希望这种说法有道理 谢谢 编辑 使用Muhammad Adeel Zahid代码作为我的基础,我想我成功了C# 如何创建视图模型,c#,asp.net-mvc,asp.net-mvc-3,C#,Asp.net Mvc,Asp.net Mvc 3,我有一个包含表单输入(文本框)的局部视图。我有另外两个部分视图使用相同的形式。一个用于添加产品,另一个用于编辑产品 此表单使用视图模型(我们称之为CoreViewModel)。现在编辑产品比添加产品有更多的字段 我想知道如何添加这些额外字段,而不让它们显示在add product表单上 我无法将这些额外字段添加到“编辑产品”视图中,它们必须位于CoreViewModel中,否则我认为设置样式将是一场噩梦 我在考虑可能有一个基类,然后进行编辑。我会给它发送一个继承这个基类的视图模型 在视图中检查视
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并将其投射回您的基础。然后,您将拥有所有的属性,因为它似乎是有效的我经常看到人们建议不要这样做。他们经常要求每个视图都有viewmodel(甚至对于编辑和创建相同实体的视图也是如此)。同样,这一切都取决于你在做什么。对于不同的验证需求,您可能在“编辑”和“创建”视图上有不同的数据注释,但如果它们相同,我们可能需要在“创建”和“编辑”中使用相同的viewmodel 为了解决你的情况,我想不出两个选择。首先,在视图模型中保留一个布尔属性,告诉您该属性是否正确,然后在视图中编辑或创建并有条件地呈现属性
public class MyViewModel
{
public string P1{get;set;}
....
public boolean Editing{get;set;}
}
在Create ActionResult中将编辑属性设置为false,在Edit ActionReult中将编辑属性设置为true。这是最简单的方法。第二个稍微脏一点,但你会觉得喜欢使用这项技术。您可以使用c#4.0的动态行为。让您的页面在页面的iherits指令中从动态继承(我使用aspx视图引擎)。然后创建一个视图模型:
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")%>
<%}>
有一个代价与动态。您将失去intellisense,并且无法使用强类型帮助程序(至少在asp.net MVC 2中)。您可以在每个视图上显示所需的字段。您是如何在视图上构建表单的?@tomascmguinness-我希望避免重复数据。我的意思是,我不想重复10个字段,因为我有2个字段需要添加。我是否可以将其强制转换为EditViewModel并查看它是否强制转换,然后使用强类型帮助程序?我会尝试一下,看看会发生什么。我想如果编辑和添加的地方完全不同,那么我会提出不同的观点,但我认为它们有80%到90%的相似性,那么我看不出有什么意义。我的意思是,如果您试图对服务器端代码进行重构,他们可能会告诉您重构代码。我不确定,但我怀疑这是可能的。因为如果您在编译时知道类型,那么将其动态化是没有意义的,因为我已经解决了所有这些问题。看我的Edit@chobo我想,使用IsEditing标志将比这种方法更干净,因为您不必在视图中进行强制转换。唯一需要做的就是在编辑和创建action@Muhammad Adeel Zahid中设置该标志-我想这可能会更干净一点,但如果你只是为了编辑而公开所有编辑属性的话。因此,您可能必须将所有内容标记为“编辑…”,否则可能不清楚它们是否仅用于编辑。