我需要一個通用的內聯幫助器來顯示字段。
這是我目前的情況:
@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。去做這個:
創建如下文件:
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());
}
}
}
在您的頁面中,這樣的事情的用法將是:
@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中有效;但我相信你也可以將你的代碼轉移到正常的類。
請注意,使用此方法可以放棄某些類型的安全性,因為調用者可以為該方法提供各種動態表達式。因此,如果分析表達式以便查找屬性,則應考慮到這一點。