ASP.NET MVC部分视图:输入名称的前缀

 2023-02-17    408  

问题描述

假设我有viewmodel,如

public class AnotherViewModel
{
   public string Name { get; set; }
}
public class MyViewModel
{
   public string Name { get; set; }
   public AnotherViewModel Child { get; set; }
   public AnotherViewModel Child2 { get; set; }
}

在视图中,我可以用

ASP.NET MVC部分视图:输入名称的前缀

呈现部分

<% Html.RenderPartial("AnotherViewModelControl", Model.Child) %>

在部分中,我会做

<%= Html.TextBox("Name", Model.Name) %>
or
<%= Html.TextBoxFor(x => x.Name) %>

但是,问题是,在我需要具有名称=”child.name”时,均呈现名称=”name”,以便为模型活页夹正常工作.或者,使用相同的部分视图呈现第二属性时,name =”child2.name”.

如何使我的部分视图自动识别所需的前缀?我可以将其作为参数传递,但这太不方便了.当我想要递归渲染时,这更糟糕.有没有一种方法可以通过前缀呈现部分视图,或者甚至更好,通过呼叫Lambda表达式进行自动重新调整,以便

<% Html.RenderPartial("AnotherViewModelControl", Model.Child) %>

将自动添加正确的”孩子”.生成的名称/id字符串的前缀?

我可以接受任何解决方案,包括3-RD Party View引擎和库 – 我实际上使用Spark View引擎(我”使用其宏解决问题)和MVCContrib,但没有找到那里的解决方案. XForms,InputBuilder,MVC V2 – 提供此功能的任何工具/洞察力都会很大.

目前我认为自己正在编码这一点,但它似乎浪费时间,我无法相信这个琐碎的东西已经没有实现.

可能存在许多手动解决方案,欢迎所有这些方法.例如,我可以强制我的部分基于IPARTIALVIEWMODEL {公共字符串前缀; T模型; }.但我宁愿喜欢一些现有/批准的解决方案.

更新:有一个类似的问题,没有答案 .

推荐答案

您可以通过以下方式扩展HTML Helper类:

using System.Web.Mvc.Html


 public static MvcHtmlString PartialFor<TModel, TProperty>(this HtmlHelper<TModel> helper, System.Linq.Expressions.Expression<Func<TModel, TProperty>> expression, string partialViewName)
    {
        string name = ExpressionHelper.GetExpressionText(expression);
        object model = ModelMetadata.FromLambdaExpression(expression, helper.ViewData).Model;
        var viewData = new ViewDataDictionary(helper.ViewData)
        {
            TemplateInfo = new System.Web.Mvc.TemplateInfo
            {
                HtmlFieldPrefix = name
            }
        };

        return helper.Partial(partialViewName, model, viewData);

    }

并只需在您的视图中使用它:

<%= Html.PartialFor(model => model.Child, "_AnotherViewModelControl") %>

,你会看到一切都好!

其他推荐答案

到目前为止,我正在搜索我发现最近的帖子的同一件事:

public static MvcHtmlString PartialFor<TModel, TProperty>(this HtmlHelper<TModel> helper, System.Linq.Expressions.Expression<Func<TModel, TProperty>> expression, string partialViewName)
    {
            string name = ExpressionHelper.GetExpressionText(expression);
            object model = ModelMetadata.FromLambdaExpression(expression, helper.ViewData).Model;
            StringBuilder htmlFieldPrefix = new StringBuilder();
            if (helper.ViewData.TemplateInfo.HtmlFieldPrefix != "")
            {
                htmlFieldPrefix.Append(helper.ViewData.TemplateInfo.HtmlFieldPrefix);
                htmlFieldPrefix.Append(name == "" ? "" : "." + name);
            }
            else
                htmlFieldPrefix.Append(name);

            var viewData = new ViewDataDictionary(helper.ViewData)
            {
                TemplateInfo = new System.Web.Mvc.TemplateInfo
                {
                    HtmlFieldPrefix = htmlFieldPrefix.ToString()
                }
            };

        return helper.Partial(partialViewName, model, viewData);
    }

编辑:
默认的答案对于嵌套部分渲染不正确.只有在必要时,您需要将新前缀附加到旧前缀.最新答案中尚不清楚(:

以上所述是小编给大家介绍的ASP.NET MVC部分视图:输入名称的前缀,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/34251.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。