簡體   English   中英

ASP.NET MVC - 將外部模型傳遞給編輯器模板

[英]ASP.NET MVC - Pass outer model to editor template

我正在為大多數表單使用自定義編輯器模板,但在嘗試使用它們呈現自定義對象選擇器時,我發現沒有簡單的方法將有關包含上下文的信息傳遞給編輯器模板。

具體來說,我的主窗體呈現域對象的編輯,編輯器模板需要呈現一個AJAX選擇器,其中包含依賴於域對象ID的對象列表。 我正在使用當前的additionalViewData參數傳遞ID,我認為這很容易出錯,因此非常難看。

我的表單包含類似於以下內容的代碼:

@Html.EditorFor(model => model.CategoryId, new { id = model.id })

編輯器模板包含如下代碼:

@{
var domainObjectId = ViewData["id"] as int?;
}

我正在使用自定義的ModelMetadataProvider來選擇對象選擇器編輯器模板,並希望使用類似的技術將有關包含模型的信息傳遞給編輯器模板,但這似乎是不可能的。

所以,我的問題是:

  1. 無論如何使用ModelMetadataProvider將有關包含模型的信息傳遞給編輯器模板?
  2. 如果沒有,除了通過弱類型的additionalViewData參數傳遞每一條附加信息之外,還有更簡潔/更簡單的方法來實現我正在嘗試的東西嗎?

提前致謝!

您需要了解EditorTemplates被設計為特定於類型,而不是特定於上下文。 使用AdditionalViewData參數給出了一些想法,但這是你將獲得的最好的。

如果您擔心類型安全,請使用ViewBag,這是一個圍繞ViewData的類型安全的動態包裝器。

@{
    var domainObjectId = ViewBag.Id;
}

我想知道是否可能首先創建此視圖模型的控制器應該是選擇對象列表的東西。 因此,您可以擁有另一種視圖模型的子屬性,而不是在視圖模型上具有整數屬性,即:

public class OuterViewModel
{
    public CategoryViewModel Category { get; set; }
}

public class CategoryViewModel
{
    public int CategoryId { get; set; }

    public IEnumerable<SelectListItem> ListOfThings { get; set; }
}

然后你的原始視圖可以有:

@Html.EditorFor(model => model.Category)

使用適用於CategoryViewModel的EditorTemplate,如下所示:

@model CategoryViewModel
@Html.DropDownFor(m => m.CategoryId, Model.ListOfThings)

您唯一需要記住的是,如果您執行任何服務器端業務邏輯驗證,添加模型錯誤並返回到您的視圖,則需要重新填充控制器后期操作中的事項列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM