我正在为大多数表单使用自定义编辑器模板,但在尝试使用它们呈现自定义对象选择器时,我发现没有简单的方法将有关包含上下文的信息传递给编辑器模板。

具体来说,我的主窗体呈现域对象的编辑,编辑器模板需要呈现一个AJAX选择器,其中包含依赖于域对象ID的对象列表。 我正在使用当前的additionalViewData参数传递ID,我认为这很容易出错,因此非常难看。

我的表单包含类似于以下内容的代码:

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

编辑器模板包含如下代码:

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

我正在使用自定义的ModelMetadataProvider来选择对象选择器编辑器模板,并希望使用类似的技术将有关包含模型的信息传递给编辑器模板,但这似乎是不可能的。

所以,我的问题是:

  1. 无论如何使用ModelMetadataProvider将有关包含模型的信息传递给编辑器模板?
  2. 如果没有,除了通过弱类型的additionalViewData参数传递每一条附加信息之外,还有更简洁/更简单的方法来实现我正在尝试的东西吗?

提前致谢!

===============>>#1 票数:5 已采纳

您需要了解EditorTemplates被设计为特定于类型,而不是特定于上下文。 使用AdditionalViewData参数给出了一些想法,但这是你将获得的最好的。

如果您担心类型安全,请使用ViewBag,这是一个围绕ViewData的类型安全的动态包装器。

@{
    var domainObjectId = ViewBag.Id;
}

===============>>#2 票数:0

我想知道是否可能首先创建此视图模型的控制器应该是选择对象列表的东西。 因此,您可以拥有另一种视图模型的子属性,而不是在视图模型上具有整数属性,即:

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)

您唯一需要记住的是,如果您执行任何服务器端业务逻辑验证,添加模型错误并返回到您的视图,则需要重新填充控制器后期操作中的事项列表。

  ask by Ian Newson translate from so

未解决问题?本站智能推荐:

1回复

Asp.Net MVC EditorFor带有模板的阵列

我有一个ClassA模型,该模型具有作为ClassB数组的属性。 我想在表中编辑ClassB实例。 我已经为创建表行的ClassB创建了EditorTemplate。 这对ClassA的编辑视图非常有用,因为MVC会自己完成所有字段索引魔术: 但是,我实际上想为包含表标
2回复

如何在Razor中使用编辑器模板创建单选按钮组

我有以下型号 我想为ShowOption枚举创建一个单选按钮组,但是我想使用编辑器模板显示该组,因为我有另一个模型创建一个FilterSetting列表,并且它将显示大约7个FilterSettings,其中每个必须有一组ShowOption属性的3个单选按钮。 问题是,当razo
1回复

调用Ajax.BeginForm和Html.BeginForm后,编辑器模板不起作用

我为枚举创建了一个可以正常工作的编辑器模板,直到我决定使用Ajax.BeginForm。 属性status具有以下定义: 我已经尝试了以下方法: 以上都不起作用。 我的模板的代码如下 调用.BeginForm方法后,仍会调用我的模板,但是模板内的Mod
1回复

用于接口或继承类的ASP.NET MVC3编辑器模板

需要使用采用接口的“EditorTemplate”,与使用类的方式相同。 我有两个问题: 如果我包含名为“EditorTemplate”的“DataAnnotation”“DataType”,我只能识别“EditorTemplate”。 这并没有太多困扰我,但能够通过类型识别它
2回复

用于属性的ASP.NET MVC编辑器模板

通常我通过@ Html.RenderModel渲染我的表单,但这次我有一个复杂的渲染逻辑,我手动渲染它。 我决定为一个属性创建一个编辑器模板。 这是代码(从默认对象编辑器模板实现粘贴的副本): 以下是我如何使用它: 但它不起作用:无论DisplayName如何都会呈现标签,并
1回复

覆盖默认的MVC编辑器模板不起作用

我一直无法在MVC 4 Razor Web应用程序中使用默认的编辑器模板。 我一直找不到任何线索。 我想重写String,Password等。我已经在模型中尝试过UIHints(即使您不必使用默认的编辑器模板),也要确保我在视图中使用了EditorFor,并将编辑器模板放在〜下/查看/共享/
2回复

ASP.NET MVC编辑器模板Html.HiddenFor值丢失

我为我的多选复选框创建了一个名为UserRoles.cshtml的编辑器模板。 我使用EditorForModel在Create.cshtml中生成了表单: 当我运行该应用程序时,我的隐藏值被遗漏了。 但是复选框具有价值。
2回复

MVC 3编辑器模板似乎不尊重HiddenInput

遵循Brad Wilson关于使用和自定义编辑器模板的出色系列文章之后,我尝试将Object.cshtml添加到Shared\\EditorTemplates文件夹中。 模板呈现,但是模型属性上的[HiddenInput(DisplayValue = false)]并未按预期呈现隐藏的<
2回复

ASP.NET MVC淘汰绑定不起作用

我正在使用Mvc4 / bootstrap 3.2和淘汰赛3.2。 问题是我有一个表格。 文本框和按钮,在按钮上单击“我将文本框值传递给控制器​​”。 从控制器绑定viewModel与表接收数据后。 但是,表中的数据没有更新,mvc模型也没有更新。 提交数据时我已经检查过了。 V
2回复

MVC4中自定义编辑器模板的客户端验证

我有一个包含对象的viewModel。 我已经为该对象定义了一个自定义编辑器模板,该模板允许我编辑该对象的每个子对象。 子级值在服务器端不是必需的(因此我没有任何必需的批注),但是,如果用户到达此特定输入,则应该是必需的。 有什么方法可以检查POST方法中这些子对象的值(在viewMo