如何以及在何处将viewmodel连接到dbcontext

时间:2014-01-10 22:04:19

标签: asp.net asp.net-mvc entity-framework viewmodel .net-4.5

我继承了一个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();

其次是许多包括......

任何建议都将不胜感激

1 个答案:

答案 0 :(得分:1)

你映射到错误的方向:

Mapper.Map(combine, asset,
           typeof(combineValidationAssetViewModel), typeof(Asset));

这会将空的combine对象映射到 asset。你应该反转它,并使用强类型(泛型)重载:

var combine = Mapper.Map<combineValidationAssetViewModel>(asset);