ASP.NET MVC帮助器js功能在Razor 4中不起作用

时间:2012-10-11 05:13:12

标签: asp.net-mvc razor razor-declarative-helpers

我在cshtml文件中有以下razor辅助函数,它在asp.net mvc 3上运行,在我迁移它mvc 4之后,它不再工作(编译)了。

主要功能PopulateForm的目的是根据服务器模型设置html控件的值。

我想出来的原因是因为行的语法:

@(SetField(formId, fieldNamePrefix + p.Name, value));

所以我改成了:

@Js.SetField(formId, fieldNamePrefix + p.Name, value);

它编译,但如果我调试它,它没有执行SetField函数的主体。

@using System.Linq;

@helper Encode(object value) {
    @(value != null ? HttpUtility.JavaScriptStringEncode(value.ToString()) : "")
}


@helper SetField(string formId, string fieldName, object value) {
    var type = (value != null) ? value.GetType() : typeof(object);
    var formattedValue = value;
    if (type == typeof(DateTime)) { formattedValue = ((DateTime)value).ToString("dd-MMM-yyyy"); }
    if (type == typeof(TimeSpan)) { formattedValue = ((TimeSpan)value).ToString("hh\\:mm"); }
    @: $("#@formId *[name='@fieldName']").changeVal("@JS.Encode(formattedValue)");
}


@helper PopulateForm(dynamic model, string formId, string[] excludedFields = null, string fieldNamePrefix = "") {
    var valueProperties = model.GetType().GetProperties();
    foreach (var p in valueProperties)
    {
        if (excludedFields != null && Array.Exists<string>(excludedFields, f => f == p.Name)) { continue; };
        var value = @p.GetValue(model, null);
        @(SetField(formId, fieldNamePrefix + p.Name, value));
    }
}

1 个答案:

答案 0 :(得分:0)

尝试这样写:

@using System.Linq;

@helper Encode(object value) {
    @(value != null ? HttpUtility.JavaScriptStringEncode(value.ToString()) : "")
}


@helper SetField(string formId, string fieldName, object value) {
    var type = (value != null) ? value.GetType() : typeof(object);
    var formattedValue = value;
    if (type == typeof(DateTime)) { formattedValue = ((DateTime)value).ToString("dd-MMM-yyyy"); }
    if (type == typeof(TimeSpan)) { formattedValue = ((TimeSpan)value).ToString("hh\\:mm"); }
    @: $("#@formId *[name='@fieldName']").changeVal("@Encode(formattedValue)");
}


@helper PopulateForm(dynamic model, string formId, string[] excludedFields = null, string fieldNamePrefix = "") {
    var valueProperties = model.GetType().GetProperties();
    foreach (var p in valueProperties)
    {
        if (excludedFields != null && Array.Exists<string>(excludedFields, f => f == p.Name)) { continue; };
        var value = p.GetValue(model, null);
        SetField(formId, fieldNamePrefix + p.Name, value);
    }
}