![](/img/trans.png)
[英]How to do an inline style with asp.net mvc 3 razor in a html helper
[英]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。 去做這個:
創建如下文件:
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中有效; 但我相信你也可以把你的代碼轉移到正常的類。
請注意,使用此方法可以避免某種類型的安全性,因為調用者可以為該方法提供各種動態表達式。 因此,如果分析表達式以便查找屬性,則應考慮到這一點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.