gpt4 book ai didi

c# - 使用 MVC3 后操作后嵌套模型丢失

转载 作者:行者123 更新时间:2023-11-30 17:14:41 25 4
gpt4 key购买 nike

我正在尝试创建 RoomType 记录。每个 RoomType 都有一个 RoomTypeInfos 集合,它是对每种语言的描述。然后,每个 RoomTypeInfo 都关联到一个 Language 记录。

因此,为了创建一个 RoomType,我为每种语言预加载了一个 RoomTypeInfo 对象。

获取操作:

//
// GET: /RoomType/Create/IdHotel
[HttpGet]
public ActionResult Create(int id)
{
List<Language> _Languages = __roomTypeRepository.GetLanguages().ToList<Language>();
RoomType roomType = new RoomType { IdHotel = id };
roomType.RoomTypeInfos = new System.Data.Linq.EntitySet<RoomTypeInfo>();
foreach (Language Language in _Languages)
{
roomType.RoomTypeInfos.Add(new RoomTypeInfo { Language = Language });
}
return View(roomType);
}

后 Action :

//
// POST: /RoomType/Create/
[HttpPost]
public ActionResult Create(RoomType roomType)
{
try
{
if (ModelState.IsValid)
{
__roomTypeRepository.InsertRoomType(roomType);
return RedirectToAction("Index", new { id = roomType.IdHotel });
}
else
{
return View(roomType);
}
}
catch
{
return View(roomType);
}
}

因此,如果在后期操作中模型无效或捕获到异常,我会在 View 的@Model.Language.Name 中收到错误,因为 Language 现在为 null。

RoomTypeInfo 编辑器模板的代码:

@model DataAccess.RoomTypeInfo
@Html.HiddenFor(model => model.Id)
@Html.HiddenFor(model => model.IdRoomType)
@Html.HiddenFor(model => model.IdLanguage)
<fieldset>
<legend>@Model.Language.Name</legend>
<div class="editor-label">
@Html.LabelFor(model => model.Name)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Name)
@Html.ValidationMessageFor(model => model.Name)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Descripcion)
</div>
<div class="editor-field">
@Html.TextAreaFor(model => model.Descripcion, new { Class = "wysiwyg" })
@Html.ValidationMessageFor(model => model.Descripcion)
</div>
</fieldset>

和 RoomType 编辑器模板:

@model DataAccess.RoomType
@Html.HiddenFor(model => model.Id)
@Html.HiddenFor(model => model.IdHotel)
<h3>
Información Básica
</h3>
<div class="editor-field">
@Html.EditorFor(model => model.RoomTypeInfos)
@Html.ValidationMessageFor(model => model.RoomTypeInfos)
</div>

我通过查询 Languages 表并将其再次设置为每个 RoomTypeInfo.Language 来修复它,但如果感觉像是一种解决方法。

在这种情况下,最佳做法是什么?

最佳答案

我们使用 BeginCollectionItem HTML helper authored by Steve Sanderson为了这。在部分 View 中,我们会将所有输入字段包装在 @using(Html.BeginCollectionItem("RoomTypeInfos")) 中。

在后台,这会更改输入元素名称和 ID,以便它们被默认模型绑定(bind)器识别并添加到 Root View 模型(在您的情况下为 RoomType)。

您的代码示例:

@model DataAccess.RoomTypeInfo
@using (Html.BeginCollectionItem("RoomTypeInfos"))
{
Html.HiddenFor(model => model.Id)
Html.HiddenFor(model => model.IdRoomType)
Html.HiddenFor(model => model.IdLanguage)
<fieldset>
<legend>@Model.Language.Name</legend>
<div class="editor-label">
@Html.LabelFor(model => model.Name)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Name)
@Html.ValidationMessageFor(model => model.Name)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Descripcion)
</div>
<div class="editor-field">
@Html.TextAreaFor(model => model.Descripcion, new { Class = "wysiwyg" })
@Html.ValidationMessageFor(model => model.Descripcion)
</div>
</fieldset>
}

此外,如果您想确保 Language 在 POST 后不为 null,则应将其添加为隐藏字段:

@Html.HiddenFor(m => m.Language.Name)

这样,它就被默认的模型绑定(bind)器绑定(bind)到模型上了。如果您不通过 HTTP POST(在某种输入字段中)发送数据,那么您的 POST 操作方法将必须在返回模型和 View 之前重新填充它。

关于c# - 使用 MVC3 后操作后嵌套模型丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8522675/

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