Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# VS 2012 MVC-使用一个视图&;更新和创建功能的模型_C#_Asp.net Mvc_Asp.net Mvc 4_Visual Studio 2012 - Fatal编程技术网

C# VS 2012 MVC-使用一个视图&;更新和创建功能的模型

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视图也工作没有问题 用例: 我想要一个网页,在那里用户可以看到从数据库中提取的项目列表。这已经在默认的索引视图中实现了,但我也希望该列表可以随时编

我是C#和MVC新手,从PHP背景进入Visual Studio环境。我在四处摸索,但已经快到了。我需要帮助理解一些基本概念,毫无疑问,这是一项非常费劲的工作,但帮助我解决这个问题将有助于我理解事物是如何工作的

我有一个SQL db,通过添加ADO.NET实体类模型连接到VS2012 web项目(C#)。可以说,该端工作没有问题,自动生成的默认CRUD视图也工作没有问题

用例:

我想要一个网页,在那里用户可以看到从数据库中提取的项目列表。这已经在默认的索引视图中实现了,但我也希望该列表可以随时编辑,而不必为每个项目输入编辑视图。因此,我将列表HTML更改为表单,并为“更新”提交设置了一个
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; }
}