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

时间:2012-02-15 21:39:47

标签: c# asp.net-mvc-3

我有一个看起来像这样的课程:

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

4 个答案:

答案 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)