2017-02-24 99 views
0

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

所以我不知道如何使用的HtmlHelper产生MvcHtmlString在控制器,例如,我有一个对象类型“项”,我该怎么办之类的东西Html.LabelFor(item => item.Name),或Html.EditorFor(item => item.Name)在控制器并获得MvcHtmlString?

+1

为什么控制器创建html?你能不能创建一个局部视图(在View文件夹中定义)并让你的控制器返回局部视图? – Sparrow

+0

如果你想用你的html做非凡的事情,可以考虑使用部分视图或显示模板。 –

+0

请参阅[此问题](http://stackoverflow.com/q/26362910/215552)及其有关在视图之外构建HTML的信息的答案。 –

回答

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)); 
      } 
     } 
+1

谢谢!我只是在寻找比“TagBuilder”更好的格式。就像使用HtmlHelper()一样,可以减少“.Attribute”或“.InnerHtml”的数量。 – Chris

+0

你的欢迎:)你可以减少你的视图代码,如该扩展名。你也可以批准我的答案来实现。谢谢。 –

+0

我刚刚做到了。谢谢 – Chris