C# VS 2012 MVC-使用一个视图&;更新和创建功能的模型
我是C#和MVC新手,从PHP背景进入Visual Studio环境。我在四处摸索,但已经快到了。我需要帮助理解一些基本概念,毫无疑问,这是一项非常费劲的工作,但帮助我解决这个问题将有助于我理解事物是如何工作的 我有一个SQL db,通过添加ADO.NET实体类模型连接到VS2012 web项目(C#)。可以说,该端工作没有问题,自动生成的默认CRUD视图也工作没有问题 用例: 我想要一个网页,在那里用户可以看到从数据库中提取的项目列表。这已经在默认的索引视图中实现了,但我也希望该列表可以随时编辑,而不必为每个项目输入编辑视图。因此,我将列表HTML更改为表单,并为“更新”提交设置了一个C# VS 2012 MVC-使用一个视图&;更新和创建功能的模型,c#,asp.net-mvc,asp.net-mvc-4,visual-studio-2012,C#,Asp.net Mvc,Asp.net Mvc 4,Visual Studio 2012,我是C#和MVC新手,从PHP背景进入Visual Studio环境。我在四处摸索,但已经快到了。我需要帮助理解一些基本概念,毫无疑问,这是一项非常费劲的工作,但帮助我解决这个问题将有助于我理解事物是如何工作的 我有一个SQL db,通过添加ADO.NET实体类模型连接到VS2012 web项目(C#)。可以说,该端工作没有问题,自动生成的默认CRUD视图也工作没有问题 用例: 我想要一个网页,在那里用户可以看到从数据库中提取的项目列表。这已经在默认的索引视图中实现了,但我也希望该列表可以随时编
ActionName
。这也没问题:
型号:
namespace Library3.DAL {
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
public partial class PrmTbl_Level {
public PrmTbl_Level() {
this.Tbl_Books = new HashSet<Tbl_Book>();
}
[Required]
[Display(Name = "ID")]
public int LevelID { get; set; }
[Required]
[Display(Name = "Description")]
public string LevelDesc { get; set; }
[Required]
[Display(Name = "Entered By")]
public string EnteredBy { get; set; }
public Boolean Active { get; set; }
public virtual ICollection<Tbl_Book> Tbl_Books { get; set; }
}
}
现在我想在列表的顶部放一个空字段,这样可以创建新条目。这基本上意味着单视图文件现在将同时满足创建和更新功能。我插入了以下HTML:
@using (Html.BeginForm("New", "ReaderLevel", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<fieldset>
<table>
<tr>
<td class="tdsm centered fade">
@Html.EditorFor(model => model.LevelID)
@Html.ValidationMessageFor(model => model.LevelID)</td>
<td><input type="text" name="desc" />
@Html.EditorFor(model => model.LevelDesc)
@Html.ValidationMessageFor(model => model.LevelDesc)</td>
<td class="tdmed centered fade">
@Html.EditorFor(model => model.EnteredBy)
@Html.ValidationMessageFor(model => model.EnteredBy)</td>
<td class="tdsm centered">
@Html.EditorFor(model => model.Active)
@Html.ValidationMessageFor(model => model.Active)</td>
</tr>
</table>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
}
@使用(Html.BeginForm(“New”,“ReaderLevel”,FormMethod.Post,New{enctype=“multipart/formdata”}))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
@EditorFor(model=>model.LevelID)
@Html.ValidationMessageFor(model=>model.LevelID)
@EditorFor(model=>model.LevelDesc)
@Html.ValidationMessageFor(model=>model.LevelDesc)
@EditorFor(model=>model.EnteredBy)
@Html.ValidationMessageFor(model=>model.EnteredBy)
@EditorFor(model=>model.Active)
@Html.ValidationMessageFor(model=>model.Active)
}
…这里引用的模型的问题应该是PrmTbl_级别类的新版本-不使用现有的IEnumerable从表中吐出现有数据(至少我认为问题是这样的!)
默认的单独创建视图通过
@model
(sans IEnumberable)引用名称空间,数据作为单个对象返回(public ActionResult Create(PrmTbl_Level PrmTbl_Level)
),然后轻松地保存到db(db.PrmTbl_Levels.Add(PrmTbl_Level);
)-如何使用one@model
语句实现相同的目标?(5)。非常感谢所有的帮助,包括实际的帮助和相关概念的帮助 简而言之,您不应该为模型使用IEnumerable
,而应该创建一个自定义类,该类表示列表(要按当前方式显示和编辑)和一个附加的PrmTbl\u级别
,您可以填充该级别以创建新的实体/行
比如说:
public class MyCustomModel
{
public MyCustomModel()
{
MyList = new List<PrmTbl_Level>();
MyItemToCreate = new PrmTbl_Level();
}
public List<PrmTbl_Level> MyList { get; set; }
public PrmTbl_Level MyItemToCreate { get; set; }
}
公共类MyCustomModel
{
公共MyCustomModel()
{
MyList=新列表();
MyItemToCreate=新的PrmTbl_级别();
}
公共列表MyList{get;set;}
公共PrmTbl_级别MyItemToCreate{get;set;}
}
现在,您的强类型模型是MyCustomModel,您需要更改视图以正确引用新模型(例如,model=>model.LevelID
变为model=>model.MyList.LevelID
)
这不是一个完整的解决方案,但应该让您开始。若要在同一列表视图中添加“创建视图”,可以使用“局部视图”。并将这个局部视图添加到列表视图的顶部,这将解决您的问题。创建新条目所需的所有字段都应在局部视图中
我是否通过IEnumberable引用模型?请更详细地回到这里,因为我遇到了编译错误。。。我可以大致了解您在那里所做的工作,并在与现有PrmTbl_级别类相同的名称空间中创建了一个新的“MyCustomModel”类。然后,我在视图中通过一个直接向上的@model调用(no IEnumerable)引用了它,并更新了对MyList.where和MyItemToCreate.Etcetera的所有引用。但是,在运行时,它无法从PrmTbl_级别类中找到定义。我必须怎么做才能将它指向正确的方向?您所说的“在运行时,它无法从PrmTbl_级别的类中找到定义”是什么意思?还有,是什么代码行导致了错误?你可以发布代码行和错误消息吗?当然可以。错误读取
编译器错误消息:CS1061:'System.Collections.Generic.List'不包含'LevelID'的定义,并且找不到接受'System.Collections.Generic.List'类型的第一个参数的扩展方法'LevelID'。(是否缺少using指令或程序集引用?)
并由行@Html.DisplayNameFor(model=>model.MyList.LevelID)
引发(这将是第一次使用文件中的model-@model Library3.DAL.MyCustomModel
)。更正-在第一次使用MyList
对象时引发错误,这是在显然成功地使用了MyItemToCreate
对象之后发生的。
@using (Html.BeginForm("New", "ReaderLevel", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<fieldset>
<table>
<tr>
<td class="tdsm centered fade">
@Html.EditorFor(model => model.LevelID)
@Html.ValidationMessageFor(model => model.LevelID)</td>
<td><input type="text" name="desc" />
@Html.EditorFor(model => model.LevelDesc)
@Html.ValidationMessageFor(model => model.LevelDesc)</td>
<td class="tdmed centered fade">
@Html.EditorFor(model => model.EnteredBy)
@Html.ValidationMessageFor(model => model.EnteredBy)</td>
<td class="tdsm centered">
@Html.EditorFor(model => model.Active)
@Html.ValidationMessageFor(model => model.Active)</td>
</tr>
</table>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
}
public class MyCustomModel
{
public MyCustomModel()
{
MyList = new List<PrmTbl_Level>();
MyItemToCreate = new PrmTbl_Level();
}
public List<PrmTbl_Level> MyList { get; set; }
public PrmTbl_Level MyItemToCreate { get; set; }
}