Asp.net mvc 如何将子模型/表的主键保存为父模型/表中的外键?
我正在学习MVC,它是一个ASP.NETMVC项目,用于一个乐谱目录系统,有两个表:ScoreList和KeySignature。KeySignature表具有主键(Id)和KeySignatureName。我有另一个正在使用的表,ScoreListItems,但我认为这个表与我的问题无关 我正在想办法做几件事 1) 当我创建一个新的ScoreList记录时,我希望KeySignature字段是一个下拉列表,用于填充KeySignature表中的keysignatureName 2) 保存记录时,我希望ScoreList表存储KeySignatureId 当我写这篇文章的时候,听起来应该很容易,但我整个星期都在挠头,弄不明白。任何帮助都将不胜感激 这就是我到目前为止所做的: 密钥签名模型:Asp.net mvc 如何将子模型/表的主键保存为父模型/表中的外键?,asp.net-mvc,Asp.net Mvc,我正在学习MVC,它是一个ASP.NETMVC项目,用于一个乐谱目录系统,有两个表:ScoreList和KeySignature。KeySignature表具有主键(Id)和KeySignatureName。我有另一个正在使用的表,ScoreListItems,但我认为这个表与我的问题无关 我正在想办法做几件事 1) 当我创建一个新的ScoreList记录时,我希望KeySignature字段是一个下拉列表,用于填充KeySignature表中的keysignatureName 2) 保存记录时
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CreswellSolution.Model
{
public class KeySignature
{
public int KeySignatureId { get; set; }
public string KeySignatureName { get; set; }
}
}
计分表模型:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CreswellSolution.Model
{
public class ScoreList : IObjectWithState
{
public ScoreList()
{
ScoreListItems = new List<ScoreListItem>();
}
public int ScoreListId { get; set; }
public string ScoreListName { get; set; }
public string ScoreListComposer { get; set; }
public int KeySignatureId { get; set; }
public virtual List<ScoreListItem> ScoreListItems { get; set; }
public ObjectState ObjectState { get; set; }
}
}
首先,确保实体建模正确。它们应该类似于:
public class ScoreList
{
[Key]
public int Id { get; set; }
...
[ForeignKey("KeySignature")]
public int KeySignatureId { get; set; }
public virtual KeySignature KeySignature { get; set; }
}
然后,在您的操作中,您只需要使用可用的键签名
选项获得一个IEnumerable
:
var keySignatureOptions = db.KeySignatures.Select(m => new SelectListItem
{
Value = m.Id.ToString(),
Text = m.Name
});
您可以将其存储在ViewBag
中,或者最好使用视图模型并将其设置在该视图模型上
那么,在你看来:
@Html.DropDownListFor(m => m.KeySignatureId, (IEnumerable<SelectListItem>)ViewBag.KeySignatureOptions)
取决于你去的方向
就这样。所选值将发回“外键”属性,因此您只需按正常方式保存即可。非常感谢您的快速响应!我会在几个小时后有机会尝试一下。我用我已有的一些代码更新了我的问题。我使用的是ViewModels——我有一个Helpers类和一个ScoreListViewModel类。如何存储上面提到的keySignatureOptions变量?
var keySignatureOptions = db.KeySignatures.Select(m => new SelectListItem
{
Value = m.Id.ToString(),
Text = m.Name
});
@Html.DropDownListFor(m => m.KeySignatureId, (IEnumerable<SelectListItem>)ViewBag.KeySignatureOptions)
@Html.DropDownListFor(m => m.KeySignatureId, Model.KeySignatureOptions)