我继承了一个mvc app。此应用程序首先使用实体框架和数据库。对于下拉列表和错误消息,它在任何地方都没有视图模型和视图。现在我的任务是对其进行许多更改,因为您无法验证主类中不存在的相关属性。
我正在尝试创建一个viewmodel,因此我只能显示必要的数据,验证它并且不能直接链接到模型。到目前为止,我使用我创建的viewmodel为表单上的所有字段获取null。我试图使用automapper,但得到映射错误:“缺少类型映射配置或不支持的映射”
这是控制器的一部分:
public ActionResult ChangeOwner(int id = 0)
{
var combine = new combineValidationAssetViewModel();
Mapper.CreateMap<ToolingAppEntities1, combineValidationAssetViewModel>();
Mapper.CreateMap<combineValidationAssetViewModel, ToolingAppEntities1>();
Asset asset = db.Assets.Find(id);
Mapper.Map(combine, asset, typeof(combineValidationAssetViewModel), typeof(Asset));
.....
return View(combine);
}
以下是视图模型的一部分:
public class combineValidationAssetViewModel
{
public Asset Assets { get; set; }
public Transaction Transactions { get; set; }
public LocationType LocationTypes { get; set; }
public ToolType ToolTypes { get; set; }
public OwnerType OwnerTypes { get; set; }
public int AssetId { get; set; }
public int fkToolTypeId { get; set; }
[Required]
[Display(Name = "Owner")]
public int fkOwnerId { get; set; }
[Required]
[Display(Name = "Location")]
public int fkLocationId { get; set; }
public int LocationTypeId { get; set; }
public int OwnerTypeId { get; set; }
以下是该观点的一部分:
@model ToolApp.ViewModels.combineValidationAssetViewModel
.....
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>Asset</legend>
@Html.HiddenFor(model => model.AssetId)
@Html.HiddenFor(model => model.CreatedByUser)
@Html.HiddenFor(model => model.CreateDate)
@Html.HiddenFor(model => model.SerialNumber)
@Html.HiddenFor(model => model.LocationTypeId)
<div class="editor-label">
@Html.LabelFor(model =>model.SerialNumber)
</div>
<div class="editor-field">
@Html.DisplayFor(model => model.SerialNumber)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.fkToolTypeId, "Tool Name")
</div>
<div class="editor-field">
@Html.DisplayFor(model => model.Description)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.fkOwnerId, "New Owner")
</div>
<div class="editor-field">
@Html.DropDownListFor(model => model.fkOwnerId, new SelectList(ViewBag.fkOwnerId, "Value", "Text"), new{style="width:320px;height:25px;"})
@Html.ValidationMessageFor(model => model.fkOwnerId),
表单显示但它是null(显示的任何字段中都没有值。我想手动映射,所以我理解它。尝试过自动播放器但它还没有工作。我从这里尝试了一些想法其他网站但结果相同。我还没有完全理解linq到ef,所以我的问题也可能在那里。
这个主控制器上有10个不同的动作结果,并且充满了数据调用和视图包。我正在寻找关于我应该去的方向的建议。我需要让这个东西工作,但也想对它进行更改,这将使它朝着可行的mvc应用程序的方向移动。目前的主要问题是如何将viewmodel与dbcontext连接起来。我发现控制器顶部的上下文是这样的:
{ private ToolingAppEntities1 db = new ToolingAppEntities1();
其次是许多包括......
任何建议都将不胜感激
答案 0 :(得分:1)
你映射到错误的方向:
Mapper.Map(combine, asset,
typeof(combineValidationAssetViewModel), typeof(Asset));
这会将空的combine
对象映射到 asset
。你应该反转它,并使用强类型(泛型)重载:
var combine = Mapper.Map<combineValidationAssetViewModel>(asset);