MVC 3 EditorTemplate - 模型属性为空

时间:2011-03-24 13:51:58

标签: asp.net-mvc-3

我为各种模型类提供了许多自定义EditorTemplates。在这些模板中,我显然需要引用模型的属性。我的问题是,当我使用Model.Id的直接语法(例如)时,该值为null。另一个例子是Model.Name,它返回一个空字符串。但是,当我在表达式中引用模型时(例如@ Html.TextBoxFor(i => i.Name)),那么值就在那里。

为了进一步说明,这是一段代码片段:

@model Vigilaris.Booking.Services.CompanyDTO
<div>
    <fieldset class="editfieldset">
        <legend class="titlelegend">Company Details</legend>
        <ol>
            <li>
               @Html.TextBox("tb1", @Model.Id) 
               @Html.TextBox("tb2", @Model.Name) 
            </li>
            <li>
                @Html.LabelFor(i => i.CreatedDate)
                @Html.DisplayFor(i => i.CreatedDate)
            </li>
            <li>
                @Html.LabelFor(i => i.Name)
                @Html.TextBoxFor(i => i.Name)
            </li>
            <li>
                @Html.LabelFor(i => i.Description)
                @Html.TextAreaFor(i => i.Description)
            </li>
            <li>
                @Html.LabelFor(i => i.Phone)
                @Html.TextBoxFor(i => i.Phone)
            </li>
        </ol>
    </fieldset>
</div>  

在此示例中,使用LabelFor和DisplayFor辅助函数的所有代码都显示模型中的数据。但是,Html.TextBox代码部分为Model.Id返回0,为Name返回空字符串。

为什么直接引用模型时它不能访问实际的模型数据?

2 个答案:

答案 0 :(得分:1)

我无法重现这一点。您可能需要提供更多上下文(控制器,视图......)。也不应该像这样命名你的文本框:

@Html.TextBox("Id", Model.Id) 
@Html.TextBox("Name", Model.Name) 

以及为什么不直接使用强类型版本:

@Html.TextBoxFor(x => x.Id) 
@Html.TextBox(x => x.Name) 

答案 1 :(得分:1)

我设法弄明白了。我在问题描述中遗漏的一件事是我正在使用Telerik MVC Grid扩展,而EditorTemplate正用于In-form编辑。因此,此时模型属性不可用,这是可以理解的行为。我必须在Telerik MVC Grid上使用客户端onEdit事件,然后根据需要设置这些值。

我记得解决这个问题的方法是我在Telerik MVC Grid中添加了一个ClientEvent,如下所示:

.ClientEvents(events => events.OnEdit("Users_onEdit"))

这会告诉网格在触发编辑时运行名为Users_onEdit的javascript函数。然后,在我的javascript函数中,我找到了我想要的字段,然后设置它的值。这是一段代码摘录:

function Users_onEdit(e) {
    if (e.mode == "insert") {
        $("#UserName").removeAttr("readonly");
        $("#UserName").removeAttr("title");
        $("#divNewUserMessage").show();

        var formId = String(e.form.id);
        var formIndex = formId.indexOf("form");
        var companyId = formId.substr(6, formIndex -6);
        var hiddenCompanyId = $(e.form).find("#CompanyId");
        hiddenCompanyId.val(companyId);
    }
}

我希望这可以帮助其他人。