C# 访问其他模型的UI元素

C# 访问其他模型的UI元素,c#,asp.net-mvc,C#,Asp.net Mvc,在我的ASP.NET MVC 4 Web应用程序中,我有两种模型: Block具有属性的Block LinkedBlock 块集合包含多个块。Block.LinkedBlock中的每个Block实例保证也在BlockCollection中 现在,我想做的是: 如果块具有链接块,则应获得一个onchange处理程序,该处理程序将链接块的文本设置为该块的文本 原则上,这很简单: if (Model.LinkedBlock != null) { var onChange = string.Fo

在我的ASP.NET MVC 4 Web应用程序中,我有两种模型:

  • Block
    具有属性的
    Block LinkedBlock
  • 块集合
    包含多个
    Block.LinkedBlock
    中的每个
    Block
    实例保证也在
    BlockCollection
  • 现在,我想做的是:
    如果
    具有链接块,则应获得一个
    onchange
    处理程序,该处理程序将链接块的文本设置为该块的文本

    原则上,这很简单:

    if (Model.LinkedBlock != null)
    {
        var onChange = string.Format("setText({0}, this.text);", linkedBlockId);
        @Html.TextBoxFor(m => m.Text, new { onchange = onChange });
    }
    
    
    函数setText(id,text){
    $(“#”+id).val(文本);
    }
    
    但问题是,我不知道如何获得链接块的正确HTML ID


    如何获取它?

    在渲染链接块时,只需向HTML助手添加任何ID即可,如:

    @Html.TextBoxFor(m => m.Text, new { id = blockId });
    
    其中,
    blockId
    是您的唯一ID,例如数据库中的ID记录。稍后,您可以在构造
    onChange
    处理程序调用时引用此ID。比如:

    var onChange = string.Format("setText({0}, this.text);", Model.LinkedBlock.ID);
    

    如果您提供更多的上下文,我将能够为您提供更多的示例代码。

    在块模型中,您应该有一个Id属性。然后在视图中,您可以引用该Id。 例如:

    class Block
    {
        public Block LinkedBlock { get; set; }
        public int Id { get; set; }
    }
    
    您的视图必须是强类型的:

    @model Models.Block
    
    或根据您正在做的事情执行以下操作:

    @model Models.BlockCollection
    
    然后将代码更改为(只需将参照添加到链接块):

    显然,您必须确保页面上的所有LinkedBlock都具有各自的ID


    这有帮助吗?

    不幸的是,这没有帮助,因为ASP.NET MVC为UI元素生成的HTML ID与模型的ID无关。true应该提到像上面提到的Floremin一样覆盖ID属性。对于相同ID出现两次的问题(见上文),这是一个问题吗?难道你不希望所有相同的块都有相同的文本吗?如果是这种情况,JQuery将改变所有这些。不确定您的需求是什么。使用相同ID的多个元素是无效的。例如,请参阅。即使无效,也可以正常工作。如果希望它是有效的,请使用a并使用JQuery调用它。多个数据属性具有相同的值是没有问题的。我希望避免这种情况,因为我可能多次显示同一块。据我所知,ASP.NET MVC将为每个生成的控件创建唯一的HTML ID,而这种方法将对多个UI元素使用相同的ID。ASP.NET WebForms将生成唯一的ID,但仅针对ASP.NET控件。没有实际的MVC控件。我正在讨论由
    HTML.EditorFor
    生成的标准HTML控件及其ID。您可以想出其他方法在呈现的HTML中查找链接块。比方说,将您的块和所有链接块放在容器div中。为链接块设置
    data id=“[linked block id]”
    ,然后使用jQuery在与块相同的容器中查找链接块。我使用了数据库id。目前,一个块只显示一次。如果这种情况改变,我必须重新考虑这个决定。
    @model Models.BlockCollection
    
    if (Model.LinkedBlock != null)
    {
        var onChange = string.Format("setText({0}, this.text);", Model.LinkedBlock.Id);
        @Html.TextBoxFor(m => m.Text, new { onchange = onChange });
    }