2016-11-08 50 views
0

我有外鍵的模型非有效模式:ASP.net:如何處理與外鍵

public class Route : IDbEntity 
{ 
    [Key] 
    public int Id { get; set; } 

    [Display(Name = "Flight number")] 
    [Required(ErrorMessage = "Flight number is required")] 
    public string FlightNumber { get; set; } 

    [Display(Name = "Aircraft")] 
    [Required(ErrorMessage = "Aircraft is required")] 
    public int? AircraftId { get; set; } 

    [ForeignKey("AircraftId")] 
    public virtual Aircraft Aircraft { get; set; } 
} 

Show視圖或Edit鑑於呼叫我用這個檢索對象:

public new async Task<Route> Get(int id) 
{ 
    return await Context 
     .Set<Route>() 
     .Where(e => e.Id == id) 
     .Include(e => e.Aircraft) 
     .FirstOrDefaultAsync(); 
} 

它的工作很棒。

但如果Edit方法收到的非有效的模型,我嘗試模型返回View

[HttpPost] 
public async Task<IActionResult> Edit(TEntity e) 
{ 
    if (!ModelState.IsValid) return View(e); 

    var isSuccessfull = await service.Update(e); 

    if (!isSuccessfull) return StatusCode(500); 

    return RedirectToAction("Index"); 
} 

Edit方法接收模式,但與外鍵空引用。

並且此方法返回模型以查看,但對外鍵對象的引用爲空,並且視圖無法使該對象正確顯示。

那麼,爲什麼編輯方法接收空引用模型?以及如何使用正確的引用返回無效的模型以查看?

回答

1

回發時,ViewModel將僅包含您在HTML中實際渲染<input>的屬性。

有兩種可能性來解決這個問題:

  • 後所需要的渲染視圖中的所有屬性。然後,ViewModel將始終包含這些值,並且在錯誤情況下也可用。
  • 重新加載數據庫中的數據,並將其與錯誤情況下的發佈模型合併。

我更喜歡第一種方法。讓我們假設你需要飛機的ID和名字來渲染視圖,但是它們在這個視圖中是不可編輯的。然後在你的Edit.cshtml,呈現隱藏字段往返這些屬性:

@Html.HiddenFor(m => m.Aircraft.Id) 
@Html.HiddenFor(m => m.Aircraft.Name) // property of related object 

PS:因爲您使用了實體模型渲染視圖,該機也將被更新,如果你選擇第一種方法。您可以通過使用ViewModel進行渲染來防止這種情況,並且只能將可以實際編輯的屬性映射到POST Edit操作中的實體。

+0

您如何看待$ .get()查詢並將數據檢索到頁面元素中而不在模型內設置任何值?每次編輯頁面加載時,我都會發送GET請求,並且效果很好。數據 - 是主鍵。我認爲這看起來很棒。但你對此有何看法? – Evgeniy175

+1

如果我正確理解您的方法,這與第二種可能性類似:將發佈的數據與來自數據庫的新數據合併。你只需通過AJAX而不是在控制器中完成。只要確保您在發佈錯誤的情況下保留髮布的數據(即可編輯屬性的新值),或者用戶放棄了他剛纔的輸入。 –

+0

我將FK實體的Id從模型發送到控制器的某些動作並處理返回的數據:\t $ .get('@ Url.Action(「GetAircraft」,「Aircrafts」)',{id:「@ Model.AircraftId」} ,功能(數據,參數){ \t \t $('#airId').select2({data:JSON.parse(data)}); \t}); – Evgeniy175