簡體   English   中英

用於字段的ASP.NET MVC內聯幫助器

[英]ASP.NET MVC inline helper for fields

我需要一個通用的內聯幫助器來顯示字段。

這是我目前的情況:

@helper DisplayField(Func<MyModel, string> field)
{
    if (string.IsNullOrWhiteSpace(field(Model)) == false)
    {
        <div class="row"> @field(Model) </div>     
    }
}

用法:

@DisplayField(m => m.Name)
@DisplayField(m => m.PhoneNumber)

我不知道如何在幫助器中顯示Label(DisplayAttribute)。 請幫忙。

在頁面頂部,添加for for System.Linq.Expressions,例如。

@using System.Linq.Expressions

(或在web.config中添加此命名空間)。

然后創建幫助器,它看起來像:

@helper DisplayField(Expression<Func<MyModel, string>> field)
{
    @Html.LabelFor(field)
    @Html.DisplayFor(field)
}

你可以在那里添加額外的邏輯來檢查空值等。你可能最好創建一個HtmlHelper,這樣你可以使用泛型類型參數而不是上面的“MyModel”和“string”。 當我上次嘗試時,無法將內聯類型參數添加到內聯幫助程序,例如。 以下是不可能的,除非這個功能已經添加:

@helper DisplayField<TModel, TValue>(Expression<Func<TModel, TValue>> field)
{
    @Html.LabelFor(field)
    @Html.DisplayFor(field)
}

因此,要獲得泛型方法,您將使用自定義HtmlHelper。 去做這個:

  1. 創建如下文件:

     using System; using System.Linq; using System.Linq.Expressions; using System.Web; using System.Web.Mvc; using System.Web.Mvc.Html; namespace MvcApplication1.HtmlHelpers { public static class HtmlHelpers { public static MvcHtmlString DisplayFieldFor<TModel, TValue>( this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> field) { var labelString = helper.LabelFor(field); var displayString = helper.DisplayFor(field); return MvcHtmlString.Create( labelString.ToString() + displayString.ToString()); } } } 
  2. 在您的頁面中,這樣的事情的用法將是:

     @Html.DisplayFieldFor(m => m.Name) @Html.DisplayFieldFor(m => m.PhoneNumber) 

您可能需要檢查頁面上的使用情況或將HtmlHelper的名稱空間添加到web.config中。

@ David_001為此提供了一個非常優雅的MVC解決方案; 我在這里留下我的答案,因為它描述了內部機制,如果您需要解決MVC開箱即用助手未涵蓋的問題,可能會有所幫助。

將參數類型從Func<MyModel, string>更改為Expression<Func<MyModel, string>> 這樣,您可以在方法中接收動態表達式,而不是在當前表單中收到的靜態委托。
您可以像這樣檢索字段的值:

var compExpr = field.Compile();
var value = compExpr.DynamicInvoke(Model);

您可以訪問動態表達式返回的成員及其屬性,如下所示:

var memberAccExpr = (System.Linq.Expressions.MemberAccessExpression)field.Body;
var attr = (DisplayAttribute)memberAccExpr.Member.GetCustomAttributes(typeof(DisplayAttribute), false).FirstOrDefault();

我在C#項目(不是MVC)中大致測試過,所以我不能說它是否在Razor中有效; 但我相信你也可以把你的代碼轉移到正常的類。
請注意,使用此方法可以避免某種類型的安全性,因為調用者可以為該方法提供各種動態表達式。 因此,如果分析表達式以便查找屬性,則應考慮到這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM