将IEnumerable 和单个模型传递给同一视图
所以我有一个名为Employee的视图,我在其中传递IEnumerable
来查看以在视图中显示一组记录,如下所示:
@model IEnumerable @{ var acc_status = ""; } Full Name Account Status Created by Rights Actions @foreach (var item in Model) { if (item.account_status) { acc_status = "Active"; } else { acc_status = "Inactive"; } @item.first_name @item.last_name @item.email @item.created_by @Convert.ToDateTime(item.last_login).ToString("MM/dd/yyyy") }
直到这一切都很好。 现在我在同一视图中有一个AddNew按钮,这将在同一个视图中切换一个modal
,其中包含所有inputs
以接受细节和字段模型的某些属性。 以下是模型包含的内容:
public class UserDetailViewModel { public string first_name { get; set; } public string last_name { get; set; } public string username { get; set; } public string email { get; set; } public string last_login { get; set; } public string created_by { get; set; } public string created_date { get; set; } public string role { get; set; } public bool account_lock { get; set; } public string access_rights { get; set; } public bool account_status { get; set; } public string e_Id { get; set; } }
所以我的问题是,我想强烈绑定视图inputs
以添加新的Record,带有模型属性,但因为我收到它作为IEnumerable
我就是不能使用@Html.TextBoxFor(m=>m.first_name)
等,强烈绑定它。 实现这一目标的最佳方法是什么? 我们如何强烈使用IEnumerable
模型集来强绑定单个记录视图?
选项1
为@model UserDetailViewModel
创建一个局部视图,并使用@Html.Partial("_UserDetailView", new UserDetailViewModel())
(或@{ Html.RenderPartial(..); }
来渲染模态表单的内容
选项2
创建仅限子操作的方法,该方法返回用于创建新用户的部分
[ChildActionOnly] public AtionResult NewUser() { return PartialView(new UserDetailViewModel()); }
并在视图中使用@Html.Action("NewUser")
(或@{ Html.RenderAction(..); }
来呈现模态表单的内容
选项3
如果要延迟呈现模型表单内容直到需要,请使用ajax调用控制器方法,该方法返回新用户的部分并更新模式的内容(如果使用客户端validation,则需要重新解析validation器)。
选项4
创建包含IEnumerable
和UserDetailViewModel
属性的视图模型,但这会强制您在POST方法上使用[Bind(Prefix = "..")]
(或传回视图中使用的主视图模型)
附注:您的UserDetailViewModel
包含许多不适合创建新用户的属性(例如created_by
和created_date
),这些属性只应在保存关联数据模型之前立即在控制器POST方法中设置,因此单独的CreateUserViewModel
仅包含您需要的属性将是一种更好的方法,特别是对于客户端和服务器端validation以及防止过度发布攻击
一种简单的方法是使用包装器模型来包含您的集合以显示您的记录,同时使用模型来添加新记录。 所以喜欢
class Wrapper { public IEnumerable Records {get; set;} public AddNewModel AddNew { get; set;} }
然而,这不是一个好的解决方案,因为你的模型有两个责任。
如果您在模型中添加new并将其渲染到显示视图中,您实现的局部视图怎么样? 那么你也可以重用这个视图来实现它的实际目的!
您可以在主视图中创建一个具有@model UserDetailViewModel
的局部视图,然后调用
@Hmtl.Partial("_UserDetailView", new UserDetailViewModel())
在您的局部视图中,您有标准助手..
- 如何使用EntityFramework保存对象图,禁用延迟加载,禁用代理和实体是不可跟踪的
- 如何在单独的程序集中获取用户标识
- System.Web.Mvc.HtmlHelper 不包含的定义
- Automapper,Mapper未初始化。 使用正确的配置调用初始化
- “当IDENTITY_INSERT设置为OFF时,无法在表’电影’中为标识列插入显式值。”
- WebApi中的C#await / async,重点是什么?
- 使用asp.net Identity进行Azure AD身份validation以进行授权
- PHP curl to .NET HttpRequest:文件上传到服务器
- 当文件实际存在于指定位置时的MVC路由