[asp.net-mvc] ASP.NET MVC Razor : HTML의 조건부 속성
아래 코드는 깨끗하지 않은 것 같습니다. 코드를 개선하기위한 제안이 있습니까?
<li @if(ViewData["pagename"].ToString()=="Business details"){ <text>class="active" </text> } >
<a @if(ViewData["pagename"].ToString()=="Business details"){ <text>style="color: white; background-color: #08C; border: 1px solid #08C;" </text> }
href="@Url.Action("BusinessDetails", "Business")">Business Details</a>
</li>
<li @if (ViewData["pagename"].ToString() == "Booking policies"){ <text>class="active"</text> }>
<a @if (ViewData["pagename"].ToString() == "Booking policies")
{ <text>style="color: white; background-color: #08C; border: 1px solid #08C;" </text> }
href="@Url.Action("BookingPolicies", "Business")">Booking policies</a>
</li>
답변
MVC에는 조건부 속성이 내장되어 있습니다.
<div @{if (myClass != null) { <text>class="@myClass"</text> } }>Content</div>
<div class="@myClass">Content</div>
@myClass가 null이면 속성을 전혀 사용하지 않습니다.
현재 문제를 해결하지 못할 수도 있지만 주목할 만합니다!
http://weblogs.asp.net/jgalloway/archive/2012/02/16/asp-net-4-beta-released.aspx
답변
<li class="@(ViewBag.pagename == "Business details" ? "active" : null)">
인라인 style="..."
을 별도의 클래스 이름으로 바꾸고 동일한 구문을 사용해야합니다.
그러나 페이지 및 작업 이름을 가져와 일반적으로 HTML을 생성하는 별도의 HTML 도우미 확장 메서드를 만드는 것이 더 깔끔합니다.
답변
값이 비어 있지 않은 경우 조건부로 속성을 추가하고 정의 된 경우 부울 함수식이 다음과 같이 평가 될 때 속성을 추가하는 작은 도우미 메서드를 사용합니다 true
.
public static MvcHtmlString Attr(this HtmlHelper helper, string name, string value, Func<bool> condition = null)
{
if (string.IsNullOrEmpty(name) || string.IsNullOrEmpty(value))
{
return MvcHtmlString.Empty;
}
var render = condition != null ? condition() : true;
return render ?
new MvcHtmlString(string.Format("{0}=\"{1}\"", name, HttpUtility.HtmlAttributeEncode(value))) :
MvcHtmlString.Empty;
}
정의되면 Razor 뷰에서이 메서드를 사용할 수 있습니다.
<li @(Html.Attr("class", "new", () => example.isNew))>
...
</li>
위의 코드는 <li class="new">...</li>
if example.isNew == true
, 그렇지 않으면 전체 class
속성 을 생략 합니다.
답변
MVC4에서
<!DOCTYPE html>
<html>
<head>
</head>
<body>
@{
string css = "myDiv";
}
<div class='@css'></div>
</body>
</html>
또는
<!DOCTYPE html>
<html>
<head>
</head>
<body>
@{
string css = "class=myDiv";
}
<div @css></div>
</body>
</html>
더 많은 정보 : http://evolpin.wordpress.com/2012/05/20/mvc-4-code-enhancements/
답변
TagWrap 확장 방법으로 접근합니다. 질문에 대한 코드는 다음과 같습니다.
@using (Html.TagWrap("li", condition ? new { @class = "active" } : null))
{
var anchorAttrs = new Dictionary<string, object> { { "href", Url.Action("BusinessDetails", "Business") } };
if(condition)
{
anchorAttrs["style"] = "color: white; background-color: #08C; border: 1px solid #08C;";
}
using (Html.TagWrap("a", anchorAttrs))
{
<text>Business Details</text>
}
}
TagWrap 확장 방법
Microsoft.AspNetCore.Mvc.ViewFeatures 사용;
public static IDisposable TagWrap(this IHtmlHelper htmlHelper, string tagName, object data)
{
return htmlHelper.TagWrap(tagName, HtmlHelper.AnonymousObjectToHtmlAttributes(data));
}
public static IDisposable TagWrap(this IHtmlHelper htmlHelper, string tagName, IDictionary<string, object> data)
{
var tag = new TagBuilder(tagName);
tag.MergeAttributes(data);
htmlHelper.ViewContext.Writer.Write(tag.RenderStartTag());
return new DisposableAction(() =>
htmlHelper.ViewContext.Writer.Write(tag.RenderEndTag()));
}
Dispose에서 닫는 태그를 렌더링하는 데 사용되는 도우미 클래스
public class DisposableAction : IDisposable
{
private readonly Action DisposeAction;
public DisposableAction(Action action)
{
DisposeAction = action;
}
public void Dispose()
{
DisposeAction();
}
}
답변
제상을 기반으로 여기에 적응, object
대신 다음을 사용합니다 string
.
public static MvcHtmlString ConditionalAttr(this HtmlHelper helper, string attributeName, object value, Func<bool> condition)
{
if (string.IsNullOrEmpty(attributeName) || value == null)
{
return MvcHtmlString.Empty;
}
var render = condition != null ? condition() : true;
return render ?
new MvcHtmlString($"{attributeName}=\"{HttpUtility.HtmlAttributeEncode(value.ToString())}\"") :
MvcHtmlString.Empty;
}
이렇게하면 다른 데이터 유형을 전달하기 전에 문자열로 변환 할 필요가 없습니다 .ToString()
.
차이점 이 있습니다. 빈 문자열을 전달해 도 여전히 렌더링됩니다. 예를 들면 :
@Html.ConditionalAttr("data-foo", "", () => Model.IsFooNeeded)
// Ouput:
data-foo=""
답변
@{ var classAttr= needClass ? "class=\"class-name\"" : "" }
그런 다음 HTML에서
<li @Html.Raw(classAttr) >