在 ASP.NET MVC 中,仅为视图模型的一个成员创建表单
Posted
技术标签:
【中文标题】在 ASP.NET MVC 中,仅为视图模型的一个成员创建表单【英文标题】:In ASP.NET MVC, create form for only one member of view model 【发布时间】:2014-07-15 20:25:27 【问题描述】:我是 ASP.NET MVC 的新手,我正在尝试创建一个页面,其中列出了许多项目,并且还包含一个用于创建新项目的小表单。 所以我创建了这个视图模型:
//The view model has the list of items as AllItems and a member variable for creating a new item.
public class IndexViewModel
public List<SListItem> AllItems get; set;
//SListItem contains ID, Name and price
public SListItem NewItem get; set;
在我的 razor 文件中,我添加以下行:
@html.EditorFor(model => model.NewItem.Name, new htmlAttributes = new @class = "form-control" )
在 html 输出中,它创建一个名称设置为“NewItem.Name”而不是“Name”的文本输入
<input name="NewItem.Name" id="NewItem_Name" type="text" value="">
在控制器中,接收通过表单提交的 POST 数据
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Index([Bind(Include = "ID,Name,ItemType")] ShoppingListItem item)
当我运行它时,“item”参数没有被填充,因为表单元素的名称为“NewItem.*”
我该如何克服这个问题?
提前致谢
【问题讨论】:
您的操作方法需要一个ShoppingListItem
类型的对象,但您的视图与IndexViewModel
绑定。正如@Stephen 所说,您需要将操作方法的输入参数更改为IndedxViewModel
【参考方案1】:
您最好为NewItem
属性使用单独的模型。您可以调用@Html.Action()
将NewItem
模型的表单呈现为索引视图的子操作。
您的索引视图如下所示:
@model Your.Namespace.IndexViewModel
<div>
<!-- your index markup -->
<!-- call this wherever the child view should render -->
@Html.Action("whatever_you_name_the_action")
</div>
你的“编辑”视图看起来像
@model Your.Namespace.SListItem
@Html.EditorFor(m => m.WhateverPropertyOfSListItemYoureAfter)
您只需要确保从子操作返回 PartialView
而不是 View
。如果您想要一个无法直接请求的“特殊”控制器操作,请使用ChildActionOnlyAttribute
标记该操作。例如:
[ChildActionOnly]
public ActionResult Edit(int? id)
return PartialView("_SListItemView");
【讨论】:
抱歉回复晚了。我试过了,效果很好。虽然,我只想在编辑操作中添加它,但我返回 PartialView("_SlistItemView", new SListItem());谢谢!! 如果您的SListItem
模型具有需要在构造函数中设置的属性(例如 List
或类似的),那么是的,这是个好主意。否则,您实际上不需要提供模型。【参考方案2】:
只需将 post 方法的签名更改为
HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Index(IndexViewModel model)
string name = model.NewItem.Name;
【讨论】:
执行此操作时,我收到此错误:附加信息:实体类型 IndexViewModel 不是当前上下文模型的一部分。 首先,您是否检查过模型现在已正确填充?我认为该错误是由实体框架引发的,很可能是由于您传递给 DbContext 方法的结果(您没有在 Index 方法中显示代码,很难准确判断)【参考方案3】:在您的剃须刀文件中添加以下代码
@Html.EditorFor(model => model.NewItem.Name, new htmlAttributes = new @class = "form-control",@Name='name' )
【讨论】:
你能解释一下你的答案吗? 谢谢!这个也可以。请注意,设置@name =“name”时不起作用它必须是句子大小写\\@Name =“name” 忽略@前面的斜线。一个***的问题 抱歉延迟回复。 @Name 将为要在服务器端呈现的指定 HTML 元素设置名称属性。以上是关于在 ASP.NET MVC 中,仅为视图模型的一个成员创建表单的主要内容,如果未能解决你的问题,请参考以下文章