我为各种模型类提供了许多自定义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返回空字符串。
为什么直接引用模型时它不能访问实际的模型数据?
答案 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);
}
}
我希望这可以帮助其他人。