ASP.NET MVC表单元素名称生成
本文关键字:元素 NET MVC 表单 ASP | 更新日期: 2023-09-27 18:24:40
我有一个类看起来像这样:
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="">
其将CCD_ 2而不是CCD_ 3发送到动作。我如何让它生成这个:
<input id="Text" name="Text" type="text" value="">
@Html.TextBoxFor(m => m.SearchModel.Text, new { id = "Text" })
使用重载TextBoxFor()
方法,该方法采用第二个object
参数(称为htmlAttributes
)。在这里,您可以指定要应用于当前使用的DOM元素(在本例中为input
元素)的HTML属性。
编辑:我认为您的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 />
元素的子站点。
为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)
假设View比您显示的要多,为什么不让您的Search方法采用UserListVM模型呢。它只包含一个对用户的空引用,所以帖子中没有发送额外的数据。
试着手动这样做:
@Html.TextBox("Text", Model.SearchModel.Text)