MVC在控制器中使用HtmlHelper方法LaberFor(),EditorFor()

时间:2017-02-24 22:04:11

标签: c# jquery ajax asp.net-mvc html-helper

我有一个显示项目列表的视图。我想在用户选择一个“编辑”时显示现有项目,或者在用户点击“创建”时显示新项目。这个“单项”窗口将在许多不同的地方被调用,所以我想将“编辑”和“创建”功能合并到一个视图中,这也不算太糟糕。我理解我可以通过在调用者的同一级别创建一个视图页面来实现这一点,当用户在此项目窗口上单击“提交”时,项目控制器完成其工作,然后重定向回调用者页面(项目列表或其他呼叫者)。但我想尝试另一种方法,即将此项目窗口设置为弹出窗口,当用户单击“显示模式”按钮时,调用者页面对控制器进行ajax调用,将项目的数据(或其id)传递为参数,控制器动态生成MvcHtmlString,返回调用者,调用者使用收到的MvcHtmlString显示弹出窗口。一切似乎都有效,但我控制器中的大量html代码看起来非常混乱。

所以我想知道如何使用HtmlHelper在控制器中生成MvcHtmlString,例如,我有一个对象类型“item”,如何在控制器中执行Html.LabelFor(item => item.Name)Html.EditorFor(item => item.Name)之类的操作并获得MvcHtmlString?

1 个答案:

答案 0 :(得分:0)

您可以扩展您的Htmlhelpers。如果您只想实现编辑/创建按钮,您可以更改视图模型的条件,或者您可能只想使用相同的模型。您可以使用我目前在我的观看中使用的此扩展程序。

public static MvcHtmlString CustomActionLink(this HtmlHelper html, string action, string controller,
          string displayText, bool isCreate)
        {
            if (isCreate)
            {
                var targetUrl = UrlHelper.GenerateUrl("Default", action, controller,
                   null, RouteTable.Routes, html.ViewContext.RequestContext, false);
                var anchorBuilder = new TagBuilder("a");
                anchorBuilder.MergeAttribute("href", targetUrl);
                string classes = "btn btn-progress";
                anchorBuilder.MergeAttribute("class", classes);

                //Return as MVC string
                anchorBuilder.InnerHtml = displayText;
                return new MvcHtmlString(anchorBuilder.ToString(TagRenderMode.Normal));
            }
            else
            {
                var spanBuilder = new TagBuilder("span");
                spanBuilder.MergeAttribute("class", "btn btn-progress");
                spanBuilder.InnerHtml = displayText;
                return new MvcHtmlString(spanBuilder.ToString(TagRenderMode.Normal));
            }
        }