最近練習寫MvcHtmlString,最直覺的方法就是把原始網頁的html copy下來,轉成字串,做為
MvcHtmlString return 值。But! 如果Model上有[Require][StringLength]之類的屬性,事情就不簡單了。
我試著用ModelMetadata.FromLambdaExpression(expr, helper.ViewData)
去抓,但只有有限的(如IsRequired)可以抓到,像[StringLength][MaxLength]就不知怎麼抓了。更何況還有客製屬性(自已寫的attribute),更無從下手。
有沒有可能把 @Html.EditorFor 的結果,當成function的傳回值?
你兩個問題都可以實現
第一個問題
你可以參照 微軟原始碼 來實作
我Github有上傳一個可對MVC原始碼下中斷點版本
你可以去追蹤程式碼如何產生
你要的答案在EditorExtensions.cs
檔案裡
連結
第二個問題
範例如下
public static MvcHtmlString MyEditorFor<TModel, TValue>(this HtmlHelper<TModel> helper,
System.Linq.Expressions.Expression<Func<TModel, TValue>> expression)
{
//呼叫原本的EditorFor
MvcHtmlString editorString = helper.EditorFor(expression);
TagBuilder div = new TagBuilder("div");
div.AddCssClass("col-md-3");
//將mvc render出來的資料塞入div節點中
div.InnerHtml = editorString.ToHtmlString();
//將div字串附值給 result
MvcHtmlString result = new MvcHtmlString(div.ToString());
return result;
}
第一個問題比較麻煩 但是可以學到比較多東西
如果要快可以選擇第二個方法