2017-02-24 89 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