HtmlHelper의 확장 메서드에서 전달 된 람다 식에서 속성 값을 가져 오는 가장 쉬운 방법은 무엇입니까?
HtmlHelper에 대한 더럽고 작은 확장 메서드를 작성하여 HtmlHelper.WysiwygFor (lambda)와 같은 것을 말하고 CKEditor를 표시 할 수 있습니다.
나는 현재 이것을 작동하고 있지만 내가 선호하는 것보다 조금 더 성가신 것 같습니다. 나는 이것을하는 더 직접적인 방법이 있기를 바랍니다.
여기 내가 지금까지 가지고있는 것입니다.
public static MvcHtmlString WysiwygFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression)
{
return MvcHtmlString.Create(string.Concat("<textarea class=\"ckeditor\" cols=\"80\" id=\"",
expression.MemberName(), "\" name=\"editor1\" rows=\"10\">",
GetValue(helper, expression),
"</textarea>"));
}
private static string GetValue<TModel, TProperty>(HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression)
{
MemberExpression body = (MemberExpression)expression.Body;
string propertyName = body.Member.Name;
TModel model = helper.ViewData.Model;
string value = typeof(TModel).GetProperty(propertyName).GetValue(model, null).ToString();
return value;
}
private static string MemberName<T, V>(this Expression<Func<T, V>> expression)
{
var memberExpression = expression.Body as MemberExpression;
if (memberExpression == null)
throw new InvalidOperationException("Expression must be a member expression");
return memberExpression.Member.Name;
}
감사!
다음과 같이 시도하십시오.
public static MvcHtmlString Try<TModel, TProperty>(
this HtmlHelper<TModel> htmlHelper,
Expression<Func<TModel, TProperty>> expression
)
{
var builder = new TagBuilder("textarea");
builder.AddCssClass("ckeditor");
builder.MergeAttribute("cols", "80");
builder.MergeAttribute("name", "editor1");
builder.MergeAttribute("id", expression.Name); // not sure about the id - verify
var value = ModelMetadata.FromLambdaExpression(
expression, htmlHelper.ViewData
).Model;
builder.SetInnerText(value.ToString());
return MvcHtmlString.Create(builder.ToString());
}
ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
Object value = metadata.Model;
String name = metadata.PropertyName;
나는 이것이 오래된 스레드라는 것을 알고 있지만 누군가가 그것을 찾고 있다면 id / name 속성을 생성하는 방법도 다음과 같습니다.
System.Web.Mvc.ExpressionHelper.GetExpressionText(expression);
내 확장 프로그램에서 이것을 사용하고 있으며 아무런 문제가 없었습니다. 중첩 된 속성에서도 잘 작동합니다.
가장 간단한 방법은 모든 것을 확장 메서드로 감싸는 것입니다.
public static class ExtensionMethods
{
public static object Value<TModel, TProperty>(this Expression<Func<TModel, TProperty>> expression, ViewDataDictionary<TModel> viewData)
{
return ModelMetadata.FromLambdaExpression(expression, viewData).Model;
}
}
따라서 호출 구문은 다음과 같습니다.
expression.Value(htmlHelper.ViewData)
ASP.NET MVC 3 Futures 에는이를위한 도우미가 포함되어 있습니다.
This isn't addressed by either Peter or BigMomma's answer, but it combines both. If you're calling this from a controller method, where you don't have access to an HtmlHelper instance, just create a base controller method like this:
public ModelMetadata GetModelMetadata<TModel, TProperty>( TModel model, Expression<Func<TModel, TProperty>> expression )
{
ViewData.Model = model; //model is null in Controller; you must set it here (or earlier) in order to extract values from the returned ModelMetadata.
return ModelMetadata.FromLambdaExpression( expression, new ViewDataDictionary<TModel>( ViewData ) );
}
Then you can read what you need from the model metadata as usual;
var mm = GetModelMetaData( model, m => m.SomeProperty );
string name = mm.PropertyName;
object value = mm.Model;
ReferenceURL : https://stackoverflow.com/questions/2846778/what-is-the-easiest-way-to-get-the-property-value-from-a-passed-lambda-expressio
'programing' 카테고리의 다른 글
Ruby로 파일 수정 날짜를 읽을 수 있습니까? (0) | 2021.01.18 |
---|---|
Paypal IPN을 통한 구독 (0) | 2021.01.17 |
OpenXML을 사용하여 Word에 줄 바꿈 삽입 (0) | 2021.01.17 |
Android Stack 활동을 지우는 방법은 무엇입니까? (0) | 2021.01.17 |
PHP-오버로드 된 속성의 간접 수정 (0) | 2021.01.17 |