使用我才刚起步,并在爱我爱上MVC设计模式。MVC减少重复代码
与它我唯一的宠物怨恨的是,它似乎产生了很多重复的代码。例如。
我有一个标准的MVC应用程序与我在一个项目DB(型号),从我的另一个控制器/视图/的ViewModels,从另一个我的检验方法再次分离分离。所有工作都很棒。
型号: 现在,我有一帮不错的EF4班在我的数据库项目,我必须使用的ViewModels在我真实的项目来访问我的数据。这里没问题。
控制器: 然而,每个控制器我有本质上是做同样的事情。它得到同时设定的ViewModels数据,因此而每个控制器,它只能获得不同的数据,他们基本上都在做同样的工作,在完全相同的方式不同。 (我目前有9个,但是这可能很容易爆炸到50多)。
例如:
public class Dummy1Controller : Controller
{
private MyProj.Data.Entities _entities = new Data.Entities();
private MyProj.Data.Entities2 _coreEntities = new Data.Entities2();
//GET: /Customers/
public ActionResult Index()
{
if (_entities.table1.Count() == 0) return View();
var pastObj = _entities.table1.First();
return View(new Table1ViewModel()
{
Id = pastObj.Id,
FirstName = pastObj.FirstName,
LastName = pastObj.LastName,
.
.
.
.
});
}
}
public class Dummy2Controller : Controller
{
private MyProj.Data.Entities _entities = new Data.Entities();
private MyProj.Data.Entities2 _coreEntities = new Data.Entities2();
//GET: /Vehicles/
public ActionResult Index()
{
if (_entities.table2.Count() == 0) return View();
var pastObj = _entities.table2.First();
return View(new Table1ViewModel()
{
RegNo = pastObj.RegNo,
Make = pastObj.Make,
Model = pastObj.Model,
.
.
.
.
});
}
}
public class Dummy3Controller : Controller
{
private MyProj.Data.Entities _entities = new Data.Entities();
private MyProj.Data.Entities2 _coreEntities = new Data.Entities2();
//GET: /Invoices/
public ActionResult Index()
{
if (_entities.table3.Count() == 0) return View();
var pastObj = _entities.table3.First();
return View(new Table1ViewModel()
{
InvNo = pastObj.InvNo,
Amount = pastObj.Amount,
Tax = pastObj.Tax,
.
.
.
.
});
}
}
浏览: 从contollers生成的每个视图工作的伟大。 Execpt,只有变化的是数据(带有标签和文本框的字段)。再次,他们都做同样的工作(但有不同的数据集)。
@model MyProject.Web.ViewModels.Table1ViewModel
@{
ViewBag.Title = "Index";
}
<link href="@Url.Content("~/Content/CSS/GenericDetailStyles.css")" rel="stylesheet" type="text/css" />
<section id="content">
<div id="table">
<div>
<h2>Customer</h2>
</div>
<div class="row">
<div class="left">@Html.LabelFor(x=>x.Id)</div>
<div class="right">@Html.TextBoxFor(model => model.Id)</div>
</div>
<div class="row">
<div class="left">@Html.LabelFor(x=>x.FirstName)</div>
<div class="right">@Html.TextBoxFor(model => model.FirstName)</div>
</div>
<div class="row">
<div class="left">@Html.LabelFor(x=>x.LastName)</div>
<div class="right">@Html.TextBoxFor(model => model.LastName)</div>
</div>
.
.
.
.
</div>
</section>
@{Html.RenderAction("Index", "FooterPartial");}
--------------------------------------------------------------------------------------
@model MyProject.Web.ViewModels.Table2ViewModel
@{
ViewBag.Title = "Index";
}
<link href="@Url.Content("~/Content/CSS/GenericDetailStyles.css")" rel="stylesheet" type="text/css" />
<section id="content">
<div id="table">
<div>
<h2>Vehicle</h2>
</div>
<div class="row">
<div class="left">@Html.LabelFor(x=>x.RegNo)</div>
<div class="right">@Html.TextBoxFor(model => model.RegNo)</div>
</div>
<div class="row">
<div class="left">@Html.LabelFor(x=>x.Make)</div>
<div class="right">@Html.TextBoxFor(model => model.Make)</div>
</div>
<div class="row">
<div class="left">@Html.LabelFor(x=>x.PatientID)</div>
<div class="right">@Html.TextBoxFor(model => model.Model)</div>
</div>
.
.
.
.
</div>
</section>
@{Html.RenderAction("Index", "FooterPartial");}
--------------------------------------------------------------------------------------
@model MyProject.Web.ViewModels.Table3ViewModel
@{
ViewBag.Title = "Index";
}
<link href="@Url.Content("~/Content/CSS/GenericDetailStyles.css")" rel="stylesheet" type="text/css" />
<section id="content">
<div id="table">
<div>
<h2>Invoice</h2>
</div>
<div class="row">
<div class="left">@Html.LabelFor(x=>x.InvNo)</div>
<div class="right">@Html.TextBoxFor(model => model.InvNo)</div>
</div>
<div class="row">
<div class="left">@Html.LabelFor(x=>x.Amount)</div>
<div class="right">@Html.TextBoxFor(model => model.Amount)</div>
</div>
<div class="row">
<div class="left">@Html.LabelFor(x=>x.Tax)</div>
<div class="right">@Html.TextBoxFor(model => model.Tax)</div>
</div>
.
.
.
.
</div>
</section>
@{Html.RenderAction("Index", "FooterPartial");}
问题: 我想制作一个控制器,并使其成为动态的。以便它可以读取来自不同视图模型的数据。 (为什么有9个或50个控制器esentially做同样的工作)
然后我想与意见也这样做。这样可以动态生成不同的字段。 (为什么有9或50个视图都在做同样的工作)。如果视图基于控制器,视图应该能够根据其属性进行更改。
基本上我想要做的就是找到一种方法告诉控制器从viewmodel X或VM - Y或VM - Z中读取数据,它应该能够生成属性,检索相关数据并传递它到接收到的视图中,将生成带有标签和文本框的字段。
我想我想知道是否有任何方式使用反射来做到这一点。由于视图模型是具有简单属性的基本类。我们可能会创建一个基本控制器类,它有一个方法来读取指定的viewmodel对象,获取其属性,读入关联的表并将该表中的字段与类中的属性进行匹配。最后可以从表中传入记录来显示。然后可以使用某种剃须刀,c#或JavaScript基于此自动生成视图。
如果可能或不可以的话,欢迎提供任何帮助。
为什么混合使用MVC和MVVM模式?我想我问的是,你需要什么ViewModel的,不只是通过模型? – Brunner
@Brunner - 首先,它是我展示的方式,我不知道如何直接做到这一点(我对MVC比较陌生)。其次,我的雇员希望这样做。最后,当我在自己的项目上工作时,我这样做是因为我不喜欢将实际的数据库作为项目的一部分,如许多示例所示,并使其自动生成或重新生成。很少有实际的例子可以告诉你如何连接到一个真实的在线数据库。如果你知道任何我会真正appreicate链接到他们。感谢您的回复。 –
我不确定“真实生活dbs”是什么意思,但您可能想要结合EF查看POCO(例如,Code-First) - 它已经或多或少地已经包装得很整齐。我也不确定你的意思是没有在项目中的实际数据库,给你例如你可以做“返回新视图(pastObj);”你甚至不用编辑视图(除@model声明虽然) – Brunner