2012-02-15 46 views
2

我有一个类,看起来像这样:ASP.NET MVC表单元素名代

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

你为什么要传递一个UserListVM当它需要一个SearchModel的看法?您的视图不会使用SearchModel以外的任何内容。 – 2012-02-15 23:22:05

回答

2
@Html.TextBoxFor(m => m.SearchModel.Text, new { id = "Text" }) 

利用重载TextBoxFor()方法,它采用第二object参数(称为htmlAttributes)。在这里,您可以指定HTML属性以应用于您当前正在使用的DOM元素(在这种情况下,您的元素为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 />元素的substite。

+0

使用'LabelFor',我需要将它作为一个字符串给它? – 2012-02-15 21:54:12

+0

@Lolcoder如果我正确理解你的问题,那么是的。把这个'object'('htmlAttributes')看作为设置HTML元素属性值的直接方式。 – 2012-02-15 21:55:42

+0

当我尝试这个时,只有id被改变,不知怎么的名字没有被覆盖。 – 2012-02-15 22:03:51

2

为您的SearchModel创建一个局部视图,并使用Html.Partial调用它。然后,从局部视图中,做所有的EditorFor/TextBoxFor扩展的

你的观点 - UserList.cshtml:

@model UserListVM 

@using (Html.BeginForm()) 
{ 
    @Html.Partial("Search", Model.SearchModel) 
} 

你的观点 - Search.cshtml:

@model SearchModel 

@Html.TextAreaFor(m => m.Text) 
0

Assumming有更多的视图比你已经显示,为什么不只是让你的搜索方法采用UserListVM模型。它只包含对用户的空引用,所以在帖子中没有发送额外的数据。

0

尝试做手工是这样的:

@Html.TextBox("Text", Model.SearchModel.Text)