我有一个看起来像这样的课程:
public class UserListVM
{
public SearchModel SearchModel { get; set; }
public PagedList<User> Users { get; set; }
}
public class SearchModel
{
public string Text { get; set; }
/* other properties */
}
我将UserListVM发送到我的视图,但该操作接受SearchModel
:
public ActionResult Search(SearchModel filter)
{
UserListVM model = new UserListVM();
model.Users = userService.GetUsers(filter);
model.SearchModel = filter;
return View(model);
}
我的观点是:
@model UserListVM
<form>
@Html.TextBoxFor(m => Model.SearchModel.Text)
</form>
但这会产生:
<input id="SearchModel_Text" name="SearchModel.Text" type="text" value="">
将UserListVM
发送给操作而不是SearchModel
。如何让它产生这个:
<input id="Text" name="Text" type="text" value="">
答案 0 :(得分:2)
@Html.TextBoxFor(m => m.SearchModel.Text, new { id = "Text" })
利用带有第二个TextBoxFor()
参数(称为object
)的重载htmlAttributes
方法。在这里,您可以指定要应用于当前正在使用的DOM元素的HTML属性(在本例中为input
元素)。
编辑:我相信你的lambda表达式是错误的。变化:
@Html.TextBoxFor(m => Model.SearchModel.Text)
要
@Html.TextBoxFor(m => m.SearchModel.Text)
// htmlAttributes omitted to show the issue
修改编辑:事实证明,即使使用指定的name
属性,也会根据表单对POST
所需字段的要求进行渲染(一个或多个)。
修改编辑修改:尽量明确FormExtensions.BeginForm()
:
@using (Html.BeginForm("Search", "YourController", FormMethod.Post, null))
{
@Html.TextBoxFor(m => m.SearchModel.Text)
}
将此作为<form />
元素的替代品。
答案 1 :(得分:2)
为SearchModel创建部分视图,并使用Html.Partial调用它。然后,从该局部视图中,执行所有EditorFor / TextBoxFor Extensions
您的观点 - UserList.cshtml:
@model UserListVM
@using (Html.BeginForm())
{
@Html.Partial("Search", Model.SearchModel)
}
您的观点 - Search.cshtml:
@model SearchModel
@Html.TextAreaFor(m => m.Text)
答案 2 :(得分:0)
假设View中显示的内容多于您所显示的内容,为什么不让您的Search方法采用UserListVM模型。它只包含对用户的空引用,因此帖子中没有发送额外的数据。
答案 3 :(得分:0)
尝试手动执行此操作:
@Html.TextBox("Text", Model.SearchModel.Text)