Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.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# post上的模型属性为空_C#_Asp.net Mvc - Fatal编程技术网

C# post上的模型属性为空

C# post上的模型属性为空,c#,asp.net-mvc,C#,Asp.net Mvc,我有一个简单的应用程序,它松散地基于asp.net教程中使用的MVC音乐商店,允许用户输入他们正在观看的电视节目的详细信息,这样他们就可以跟踪每个节目中他们在看哪一集 我的应用程序中的主要实体如下所示: Public class Show { // a few automatic properties public int id { get; set; } public Genre Genre { get; set; } } 还有体裁课 Public par

我有一个简单的应用程序,它松散地基于asp.net教程中使用的MVC音乐商店,允许用户输入他们正在观看的电视节目的详细信息,这样他们就可以跟踪每个节目中他们在看哪一集

我的应用程序中的主要实体如下所示:

Public class Show
{
      // a few automatic properties
      public int id { get; set; }
      public Genre Genre { get; set; }
}
还有体裁课

Public partial class Genre
{
    public int GenreId { get; set; }
    public string Name { get; set; }
    public List<Show> Shows { get; set; }
}
当我在调试器中检查db时,我可以看到Show对象(无论当时数据库中有多少个对象。我用两个对象作为种子,但通常通过表单添加第三个对象)都具有我输入的类型,但在编辑操作返回视图后,该类型为null,而所有其他值都会更新。为什么会这样

我想也许流派字段是空的,因为我没有实例化它们,但是我应该在哪里做呢?我不希望每次节目类型设置时都创建新的类型。我只是希望一个节目有一个流派参考,这样我最终可以允许用户选择一个流派,并查看他们关注的所有该流派的节目

编辑:这是我的编辑视图。细节视图看起来也非常相似

@model watchedCatalogue2.Models.Show

@{
    ViewBag.Title = "Edit";
}

<h2>Edit</h2>

@using (Html.BeginForm()) {
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>@Html.DisplayFor(m => m.Name)</legend>

        @Html.HiddenFor(m => m.id)

        <div class="editor-label">
            @Html.LabelFor(m => m.Name)
        </div>
        <div class="editor-field">
            @Html.EditorFor(m => m.Name)
            @Html.ValidationMessageFor(m => m.Name)
        </div>

        <div class="editor-label">
            @Html.LabelFor(m => m.Genre)
        </div>
        <div class="editor-field">
            @Html.EditorFor(m => m.Genre.Name)
            @Html.ValidationMessageFor(m => m.Genre.Name)
        </div>

        <div class="editor-label">
            @Html.Label("Number of episodes")
        </div>
        <div class="editor-field">
            @Html.EditorFor(m => m.NoEpisodes)
            @Html.ValidationMessageFor(m => m.NoEpisodes)
        </div>

        <div class="editor-label">
            @Html.Label("Number of episodes watched")
        </div>
        <div class="editor-field">
            @Html.EditorFor(m => m.NoEpisodesWatched)
            @Html.ValidationMessageFor(m => m.NoEpisodesWatched)
        </div>

        <div class="editor-label">
            @Html.Label("Watching State")
        </div>
        <div class="editor-field">
            @Html.DropDownListFor(m => m.State,      watchedCatalogue2.Models.Show.WatchStateItems)
        </div>

        <div class="editor-label">
            @Html.LabelFor(m => m.Description)
        </div>
        <div class="editor-field">
            @Html.EditorFor(m => m.Description)
            @Html.ValidationMessageFor(m => m.Description)
        </div>

        <p>
            <input type="submit" value="Save" />
        </p>
    </fieldset>
@model watchedcataloge2.Models.Show
@{
ViewBag.Title=“编辑”;
}
编辑
@使用(Html.BeginForm()){
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
@DisplayFor(m=>m.Name)
@Html.HiddenFor(m=>m.id)
@LabelFor(m=>m.Name)
@EditorFor(m=>m.Name)
@Html.ValidationMessageFor(m=>m.Name)
@LabelFor(m=>m.Genre)
@EditorFor(m=>m.Genre.Name)
@Html.ValidationMessageFor(m=>m.Genre.Name)
@Html.Label(“剧集数”)
@EditorFor(m=>m.NoEpisodes)
@Html.ValidationMessageFor(m=>m.NoEpisodes)
@Html.Label(“观看的剧集数”)
@EditorFor(m=>m.noepisodes)
@Html.ValidationMessageFor(m=>m.noepised)
@Html.Label(“监视状态”)
@DropDownListFor(m=>m.State,watchedcataloge2.Models.Show.WatchStateItems)
@LabelFor(m=>m.Description)
@EditorFor(m=>m.Description)
@Html.ValidationMessageFor(m=>m.Description)

此外,为了更好地测量,我的控制器中的db指的是我的CatalogEntities类:

namespace watchedCatalogue2.Models
{
    public class CatalogueEntities : DbContext
    {
        public DbSet<Genre> Genres { get; set; }
        public DbSet<Show> Shows { get; set; }
    }
}
名称空间监视目录2.Models
{
公共类目录:DbContext
{
公共数据库集类型{get;set;}
公共数据库集显示{get;set;}
}
}

如果我正确地解决了这个问题,您需要以某种方式将其呈现在表单上,以便维护数据,请记住web是无状态的,如果在发布表单时该值不存在,则不会将其绑定回视图模型

根据您的意见,在表格中包括:

@Html.HiddenFor(model=>model.GenreId)


或者,根据Get上URL的不同,您可以更改POST方法签名以包含id。

问题可能在于,在MVC中,所有数据都不会保留/发布到POST方法上,而只是那些在视图上作为可编辑元素呈现并包含在模型中的数据

最简单的解决方法是将其渲染为隐藏字段,如下所示:

MVC 2.0及更早版本:

<%: Html.HiddenFor(m => m.GenreId) %>
如果使用AJAX或类似的工具,也可以将值作为参数发送/传递


另外请注意,如果您使用ModelState.IsValid功能,则隐藏字段很可能会呈现为null,并且很可能是一个问题。要删除这一点(并不总是建议这样做),只需添加
ModelState.remove(“TheKey”);
,在您的情况下可能是
ModelState.remove(“GenreID”)

经过一些研究后,我注意到示例中的许多模型类引用了其他标记为虚拟的模型。我想我没有什么损失,所以我修改了我的Show类,以便
公共体裁{get;set;}
现在阅读
公共虚拟体裁{get;set;}
。突然之间,一切都正常了。如果有人知道它为什么会正常工作,能向我解释一下,我将不胜感激,因为到目前为止,我所看到的都是对延迟加载的引用,但与我的问题无关


谢谢大家的帮助。

代码不完整(
p
public?)。我假设您在
Show
对象上有一个
GenreId
。您是否尝试过绑定/设置它,然后简单地保存。@AndrewBacker,GenreId在流派对象上。Show对象只是对流派对象的引用。在我的编辑视图中,您应该能够看到我在做什么。我正在尝试获取用户拥有的内容输入并将其绑定到Show.Genre.Name。即使在db.SaveChanges()之后,它似乎也不会保持不变,我认为它会向数据库写入任何新内容。调用db.dispose之后,我看到该类型为null(当然是在SaveChanges之后)。这篇文章的更新很好。我想现在回答可能更容易:)另外,我不会使用
editorfor
,而是使用
TextboxFor
等等。如果你有一个像
DateTime
这样的自定义编辑器(尽管我倾向于使用jQuery)或者一个自定义模型,然后就可以了。
EditorFor
只是一个脚手架,我不想改变它。你会使用
TextboxFor
进行输入验证还是其他什么?如果我正确理解了你的答案,你是说数据不会被保留,除非它在视图上(无论是可见的还是隐藏的).我已经更新了我的原始问题,包括我从中获取数据的视图,并且那里有一个可见的GenreId字段,因此,如果我错了,请纠正我,
<%: Html.HiddenFor(m => m.GenreId) %>
@Html.HiddenFor(m => m.GenreId)