MVC Helper对象和属性名称

时间:2015-03-05 22:44:17

标签: c# asp.net-mvc

我创建了我的第一个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;
    }

2 个答案:

答案 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然后使用备用。

将其呈现在我的第一个html / razor模板上

易。

一些阅读: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的长度并在必要时拆分它。