我创建了我的第一个MVC帮助程序,在表中拆分长字符串,我还验证字符串是否为NULL,用户可以发送NullString ='NA'
来显示而不是空字符串。
public static IHtmlString Split(
this HtmlHelper helper,
string source,
int size = 30,
string NullString = "")
现在我遇到了一个字符串在一个对象里面的情况,这个对象也可以是null。
@if (item.city == null)
{
<td>NA</td>
}
else
{
<td class="format">@item.city.name</td>
}
我想做一些通用的东西,我得到一个对象和一个属性名称。然后我可以从对象中获取值。
public static IHtmlString Split(
this HtmlHelper helper,
OBJECT source,
STRING property,
int size = 30,
string NullString = "")
有没有办法从普通对象中获取source.property()
?
按要求提供当前功能的完整代码
public static IHtmlString Split(this HtmlHelper helper, string source, int size = 30, string NullString = "")
{
TagBuilder tb = new TagBuilder("td");
tb.Attributes.Add("class", "format");
if (source == null)
{
tb.InnerHtml = NullString;
}
else if (source.Length < size)
{
tb.InnerHtml = source;
}
else
{
int middle = source.Length / 2;
int before = source.LastIndexOf(' ', middle);
int after = source.IndexOf(' ', middle + 1);
if (before == -1 || (after != -1 && middle - before >= after - middle))
{
middle = after;
}
else
{
middle = before;
}
string s1 = source.Substring(0, middle);
string s2 = source.Substring(middle + 1);
tb.InnerHtml = s1 + "<br />" + s2;
}
MvcHtmlString result = new MvcHtmlString(tb.ToString(TagRenderMode.Normal));
return result;
}
答案 0 :(得分:1)
我就是这样做的。
使用Razor模板创建一个扩展方法,接受要检查的对象和lambda来获取字符串。
public static class HtmlHelperExtensions
{
public static IHtmlString AlternateTemplates<TModel>(this HtmlHelper htmlHelper, TModel model,
Func<TModel, string> stringProperty, Func<string, HelperResult> template,
Func<object, HelperResult> nullTemplate) where TModel : class
{
HelperResult result;
if (model != null)
{
var propertyValue = stringProperty.Invoke(model);
var splitValue = YourCustomSplitFunction(propertyValue); // TODO: Impliment yout split function to return a string (in this case)
result = template(splitValue);
}
else
{
result = nullTemplate(null);
}
htmlHelper.ViewContext.Writer.Write(result);
return MvcHtmlString.Empty;
}
}
鉴于这样的模型:
public class ViewModel
{
public Region Region { get; set; }
}
public class Region
{
public string City { get; set; }
}
我的控制器动作为例:
在我看来,我可以打电话:
@Html.AlternateTemplates(Model.Region, x => x.City, @<div>@item</div>, @<div>N/A</div>)
因此,它检查我发送的对象(在这种情况下它是Region
)是否为空,然后获取我指定的属性(在这种情况下{{1然后使用备用。
易。
一些阅读:http://www.prideparrot.com/blog/archive/2012/9/simplifying_html_generation_using_razor_templates
答案 1 :(得分:1)
一种方法是获取对象的类型,然后检查给定名称的属性是否存在。您的帮助方法将接受以下参数:
public static IHtmlString Split(
this HtmlHelper helper,
object source,
string property = "",
int size = 30,
string NullString = "")
然后你将获得源对象的System.Type
并决定是将其视为字符串,还是尝试获取某些指定属性的值。
var stringToSplit = string.Empty;
if (source == null)
{
stringToSplit = NullString;
}
else if (string.IsNullOrEmpty(property))
{
stringToSplit = source.ToString();
}
else
{
Type type = source.GetType();
var propertyInfo = type.GetProperty(property);
if (propertyInfo != null)
{
var propertyValue = propertyInfo.GetValue(source);
stringToSplit = propertyValue != null ? propertyValue.ToString() : NullString;
}
else
{
stringToSplit = NullString;
}
}
然后你会检查stringToSplit
的长度并在必要时拆分它。