gpt4 book ai didi

c# - 帖子上的模型属性为空

转载 作者:行者123 更新时间:2023-11-30 16:12:06 26 4
gpt4 key购买 nike

我有一个简单的应用程序,它大致基于 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; }
}

我 Controller 中的 POST 编辑方法是由 VS 为我生成的:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(Show show)
{
if (ModelState.IsValid)
{
db.Entry(show).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(show);
}

当我在调试器中检查 db 时,我可以看到 Show 对象(无论当时数据库中有多少个对象。我用两个作为种子,但通常通过表单添加第三个)都具有我所拥有的类型已输入,但在编辑操作返回 View 后,流派为空,而所有其他值均已更新。这是为什么?

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

编辑:这是我的编辑 View 。详细信息 View 看起来也非常相似。

@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>

此外,为了更好地衡量,我的 Controller 中的 db 指的是我的 CatalogueEntities 类:

namespace watchedCatalogue2.Models
{
public class CatalogueEntities : DbContext
{
public DbSet<Genre> Genres { get; set; }
public DbSet<Show> Shows { get; set; }
}
}

最佳答案

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

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

MVC 2.0 及更早版本:

<%: Html.HiddenFor(m => m.GenreId) %>

Razor :

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

如果您使用 AJAX 或类似的东西,您也可以将值作为参数发送/传递。

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

关于c# - 帖子上的模型属性为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23487581/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com