2014-01-10 71 views
0

我繼承了一個mvc應用程序。這個應用程序首先使用數據庫實體框架。這是沒有viewmodels和viewbags的下拉和錯誤消息。現在我的任務是對其進行很多更改,因爲您無法驗證不在主類中的相關屬性等。如何以及在哪裏將viewmodel連接到dbcontext

我想創建一個viewmodel,這樣我只能顯示必要的數據,驗證它,而不是直接鏈接到模型。到目前爲止,我使用我創建的視圖模型爲窗體上的所有字段獲得了空值。我曾嘗試使用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), 

的形式顯示,但它爲空(在任何字段沒有值顯示。我想手動映射它,所以我明白了。已經嘗試過automapper,但它還沒有工作。我從這裏和其他網站嘗試了一些想法,但結果相同。我還沒有完全理解linq,所以我的問題也可能存在。

這個主控制器有10個不同的動作結果,並充滿了數據調用和視圖包。我正在尋找關於我應該去的方向的建議。我需要得到這個東西的工作,但也想對它做出改變,將它移到一個可行的mvc應用程序的方向。目前的主要問題是如何將視圖模型與dbcontext連接起來。我發現上下文在控制器這樣的頂部:

{ private ToolingAppEntities1 db = new ToolingAppEntities1(); 

其次是許多包括...

任何建議,將不勝感激

+1

爲什麼在地球上您在控制器操作中調用Mapper.CreateMap? AutoMapper映射應該只爲每個AppDomain定義一次,在ASP.NET MVC應用程序中顯然是你的'Application_Start'方法。 –

+1

請添加ChangeOwner動作的剩餘部分,以便我們可以看到返回的內容。 – Martin4ndersen

+0

因爲我是初學者,不確定放在哪裏。我在一些例子中看到它,但沒有什麼可以與之比較。這就是我問這個問題的原因。感謝您的迴應。 – Sue

回答

1

你映射到錯誤的方向:

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

這將空的combine對象映射到asset。您應該將其反轉,並使用強類型(通用)過載:

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

感謝您的建議,我創建了這個視圖模型來爲原始開發者遺漏的一些字段添加驗證,因爲它是使用視圖模型構建的。這個視圖模型需要5個DbSets。如何將它們結合起來用於自動映射?當我嘗試您所建議的內容時出現錯誤:請參閱下一個註釋 – Sue

+0

例外情況是:缺少類型映射配置或不支持的映射。映射類型:HashSet'1 - > Transaction System.Collections.Generic.HashSet'1 [[ToolingApplication.Transaction,ToolingApplication,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null]] - > ToolingApplication.Transaction目標路徑:combineValidationAssetViewModel .Transactions.Transactions源值:System.Collections.Generic.HashSet'1 [ToolingApplication.Transaction]事務是DbSets的其中一個 – Sue

+1

您正在將集合映射到標量屬性,如「公共事務事務」。視圖模型中的屬性必須是'IEnumerable '。實際上,您需要一個TransactionViewModel,因爲您無法在EF LINQ查詢中創建實體類型。 –

相關問題