iT邦幫忙

0

MvcHtmlString 與 ModelMetadata

最近練習寫MvcHtmlString,最直覺的方法就是把原始網頁的html copy下來,轉成字串,做為
MvcHtmlString return 值。But! 如果Model上有[Require][StringLength]之類的屬性,事情就不簡單了。
我試著用
ModelMetadata.FromLambdaExpression(expr, helper.ViewData)
去抓,但只有有限的(如IsRequired)可以抓到,像[StringLength][MaxLength]就不知怎麼抓了。更何況還有客製屬性(自已寫的attribute),更無從下手。

有沒有可能把 @Html.EditorFor 的結果,當成function的傳回值?

石頭 iT邦研究生 3 級 ‧ 2017-12-13 23:38:58 檢舉
請問兩個問題嗎?
一.自製的HtmlHelper擴展 要怎麼獲得Attribute上的屬性?
二. @Html.EditorFor 的結果,當成function的傳回值?
不過第二個問題可否在說明詳細一點
Brandon iT邦新手 4 級 ‧ 2017-12-14 09:38:20 檢舉
是2個問題。第一個問題算比較正規,第二個問題是懶人的想法:比如說,我有一個
"@Html.EditorFor(model => model.master.VOUCHER_TYPE, new { htmlAttributes = new { @class = "form-control" } })"

在Model中是這樣
[StringLength(10)]
[Display(Name = "表單單別")]
public string VOUCHER_TYPE { get; set; }

render 出來後的html會是
"<div class="col-md-3">
<input name="master.master.VOUCHER_TYPE" class="form-control text-box single-line" id="master.VOUCHER_TYPE" type="text" value="" data-val="true"
data-val-length="欄位 表單單別 必須是最大長度為 10 的字串。" data-val-length-max="10">
</div>"

那有沒有可能直接把 render 出來的html 變成我的 在我的 MvcHtmlString 的一部份?

1 個回答

0
石頭
iT邦研究生 3 級 ‧ 2017-12-14 11:24:28
最佳解答

你兩個問題都可以實現

第一個問題
你可以參照 微軟原始碼 來實作
我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;
}

第一個問題比較麻煩 但是可以學到比較多東西
如果要快可以選擇第二個方法

Brandon iT邦新手 4 級 ‧ 2017-12-14 21:34:11 檢舉
  1. 微軟的source,我也看過,但可能慧根不夠,沒有找到我想要的。
  2. 這就是我想要的,感謝!!/images/emoticon/emoticon41.gif

我要發表回答

立即登入回答