HTML.TextBoxFor中的动态属性

时间:2017-02-27 20:19:10

标签: asp.net-mvc razor

我正在尝试使用条件属性构建TextBoxFor。

如果Model.question没有CALC_EXPRESSION,我甚至不希望显示数据公式属性。

这可能吗?这不起作用:

@Html.TextBoxFor(q => question.AnswerFloatString,
    new
    {
        Value = "",
        id = String.Concat("Percent_of_Funding_", i.ToString()),
        Name = "QuestionBasicSection.Questions[" + question.Index+ "].AnswerFloatString",
        @class = "form-control percentMask",
        data_bind = "textInput: sdto.DATE_INACTIVE",
        data_pattern = question.FORMAT_VALIDATION,
        data_cell = "F" + (15 + i).ToString(),
        data_format = (question.FORMAT_VALIDATION == "pecent" ? "0.00%" : (question.FORMAT_VALIDATION == "currency" ? "$0,0.00" : "")),
        (question.CALC_EXPRESSION.Trim() != "" ? data_fomula = question.CALC_EXPRESSION:""),
        @readonly = "readonly",
        tabindex = "-1"
    })

但如果我这样做:

data_fomula = (question.CALC_EXPRESSION.Trim() != "" ? question.CALC_EXPRESSION:""),

我在HTML中获取并清空属性,如果模型中没有CALC_EXPRESSION,我得到一个"对象引用没有设置"例外。 如果问题,我也不介意没有数据格式属性.FORMAT_VALIDATION!='%'或者'货币'。

3 个答案:

答案 0 :(得分:4)

Html.TextboxFor将IDictionary作为参数来填充文本框的html属性。

https://msdn.microsoft.com/en-us/library/system.web.mvc.html.inputextensions.textboxfor(v=vs.118).aspx

您应该创建一个字典,其中包含根据您的逻辑填充的所有属性,然后将该字典传递给textboxfor方法。

通过这种方式,您可以更好地控制哪个属性存在与否,具有什么价值。

var attributes = new Dictionary<string,object>();

attributes.Add ("id", String.Concat("Percent_of_Funding_", i.ToString()));
// and so on.... keep adding the attributes based on the logic.
//Have an if block for adding certain attribute only if certain condition is met. 
//That way you will not have the unnecessary attributes. 
@Html.TextBoxFor(q => question.AnswerFloatString, attributes)

答案 1 :(得分:1)

后一种方法是你应该怎么做,但你想从三元而不是空字符串返回null,即:

data_fomula = (question.CALC_EXPRESSION.Trim() != "" ? question.CALC_EXPRESSION : null),

生成的HTML中不包含null属性。

答案 2 :(得分:0)

我想做的是将一个对象从viewModel传递到视图,然后获取它们,并轻松地if选择我需要的对象:

查看模型:

public string FormRoot;

    public string form()
    {
        if (FormRoot == "Edit")
        {
            return ("1");
        }
        else if(FormRoot == "Details")
        {
            return ("2");
        }
        return ("No valido");
    }

控制器:

    var viewModel = new SubCategoryViewModel()
    {
        SubCategory = subCategory,
        Categories = await _context.Categories.ToListAsync(),
        FormRoot = style //Style is the info sent to the method
    };

查看:

@Html.TextBoxFor(m => m.SubCategory.Name, "", new {@class = "form-control", @disabled = Model.FormRoot.ToString() == "Edit" ? "false" : "true" })

动态类正在运行,但是在这种情况下,即使类似于"disabled="false",页面中的textBox也保持禁用状态。