[ASP.Net MVC] 使用自訂Razor語法來Disable網頁元素

使用自訂Razor語法來Disable網頁元素

前言

 

在View中經常會針對部分輸入框,依據邏輯的不同來設定Disable/Enable狀態,好讓使用者清楚地了解目前狀態是不允許更改部分資訊的。為實現此目的可能會在View中寫出以下判斷式,當IsEditable為true時可以針對UserId進行編輯,反之則加註上disabled屬性來取消此輸入框之編輯功能;但試想一下,如果很多欄位都需要判斷,是不是在View中就充斥著許多判斷式以及重複的代碼? 因此可使用以下所介紹的方式進行簡化。

 

{
    // 可編輯 (Enable)
    @Html.EditorFor(model => model.UserId)
}
else
{
    // 不可編輯 (Disable)
    @Html.EditorFor(model => model.UserId, new { htmlAttributes = new { disabled = "disabled" } })
}

 

 

實作方法

 

方法一  擴充HtmlString類別方法

 

由於@Html.EditorFor() 回傳的是HtmlString類別,因此自行定義一個IsDisable的HtmlString擴充方法,主要功能就是在產出的Html中加註disabled屬性來使該元素失效,請參考以下代碼。

{
    public static MvcHtmlString IsDisable(this MvcHtmlString htmlString, bool isDisable)
    {
        if (isDisable)
        {
            var html = htmlString.ToString();
            var disabled = " disabled=\"disabled\" ";
            html = html.Insert(html.IndexOf(">", StringComparison.Ordinal), disabled);
            return new MvcHtmlString(html);
        }
        return htmlString;
    }
}

 

使用方式如下,是不是清爽多了

@Html.EditorFor(model => model.UserId).IsDisable(!Model.IsEditable)

 

 

方法二  擴充HtmlHelper類別方法

 

當需要對Button設定Disable/Enable條件時,由於HtmlHelper並沒有提供產出Button的方法,因此自然就無法使用上述方式來處理;此時就可以使用最簡單且靈活的方式來擴充一個HtmlHelper方法,主要功能就是依據傳入的條件來產出disabled = 'disabled'字串,方法如下。

{
    public static string IsDisabled(this HtmlHelper helper, bool isDisabled)
    {
        // 是否傳出 disabled = 'disabled' 字串
        return isDisabled ? "disabled = 'disabled'" : string.Empty;
    }
}

 

使用方式如下

<input type="button" value="Edit" @Html.IsDisabled(!Model.IsEditable)>

希望此篇文章可以幫助到需要的人

若內容有誤或有其他建議請不吝留言給筆者喔 !