在 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 =&gt; model.NewItem.Name, new htmlAttributes = new @class = "form-control",@Name='name' )

【讨论】:

你能解释一下你的答案吗? 谢谢!这个也可以。请注意,设置@name =“name”时不起作用它必须是句子大小写\\@Name =“name” 忽略@前面的斜线。一个***的问题 抱歉延迟回复。 @Name 将为要在服务器端呈现的指定 HTML 元素设置名称属性。

以上是关于在 ASP.NET MVC 中,仅为视图模型的一个成员创建表单的主要内容,如果未能解决你的问题,请参考以下文章

ASP.net MVC - 如何在各种视图中保留模型

ASP.NET MVC 视图模型模式

将多个模型传递给 ASP.NET MVC 中的视图

ASP.NET MVC & C#:将视图模型传递给控制器

ASP .Net MVC 模型 - ViewModel - 视图

模型在按钮单击 ASP.NET MVC 5 时为空