我有一个视图显示项目列表。当用户选择"编辑"的用户时,我想显示现有项目,或者在用户单击"创建"时显示新项目。这个"单个项目"窗口将在许多不同的位置调用,因此我想将功能"编辑"one_answers"创建"组合到一个视图中,这还不错。我知道我可以通过在呼叫者的同一级别上创建一个查看页来做到这一点,当用户在此项目窗口上单击"提交"时,项目控制器执行其作业,然后将其重定向到呼叫者页面(项目列表或其他呼叫者)。但是我想尝试另一种方法,它是将此项目窗口作为弹出窗口,当用户单击"显示模式"按钮时,呼叫者页面对Controller进行AJAX调用,将项目的数据(或其ID)作为参数,控制器动态生成MVCHTMLSTRING,返回呼叫者,然后使用接收到的MVCHTMLSTRING显示弹出窗口。一切似乎都在起作用,但是我的控制器中的大量HTML代码看起来很混乱。
所以我不知道如何使用htmlhelper在控制器中生成MVCHTMLSTRING,例如,我有一个对象类型" item",我如何在控制器中进行 Html.LabelFor(item => item.Name)
或 Html.EditorFor(item => item.Name)
之类的事情并获取mvCHTMLSTRING?
您可以扩展HTMLHELPER。如果您只想获得编辑/创建按钮,并且可以更改状态的ViewModel,或者您只想使用相同的型号。您可以使用我当前在视图上使用的扩展名。
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));
}
}