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="">

ASP.NET MVC表单元素名称生成

@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)