我是从MVC开始,来自Web Forms,我决定为我的第一个项目制作一个食谱网站。
我选择了数据库第一种方法,因为这就是我工作的公司所做的事情,虽然代码首先在开发人员中受到青睐,但数据库首先实际上是大多数公司所做的。
所以我的"创建" view我已经可以用标题,描述,时间等创建一个新的配方 但是我坚持第一个挑战:动态地为配方添加步骤。
我想我可以让它与FormCollection一起使用,但我在控制器操作和视图表单中失去了我必须做的事情。我可以完全使用JavaScript工作,但是我必须对标签,输入和数据验证的所有HTML进行硬编码,而不是使用Razor及其所有优点。
This is my database diagram。以红色突出显示,这样您就可以轻松看到我想要做的事情。
Recipe.cs由EF自动生成(ReceitaPasso = RecipeStep):
public partial class Receita
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public Receita()
{
this.ReceitaImagem = new HashSet<ReceitaImagem>();
this.ReceitaIngrediente = new HashSet<ReceitaIngrediente>();
this.ReceitaNota = new HashSet<ReceitaNota>();
this.ReceitaPasso = new HashSet<ReceitaPasso>();
this.ReceitaTag = new HashSet<ReceitaTag>();
}
public int ReceitaID { get; set; }
public string Titulo { get; set; }
public string Descricao { get; set; }
public Nullable<int> ReceitaTipoID { get; set; }
public Nullable<int> ReceitaGastronomiaID { get; set; }
public Nullable<int> ReceitaDificuldadeID { get; set; }
public Nullable<int> ReceitaCustoID { get; set; }
public Nullable<decimal> TempoTotal { get; set; }
public Nullable<decimal> TempoPreparacao { get; set; }
public Nullable<decimal> TempoCozedura { get; set; }
public Nullable<int> Doses { get; set; }
public Nullable<bool> Flag { get; set; }
public string Guid { get; set; }
public Nullable<int> DosesUnidadeID { get; set; }
public string UserId { get; set; }
public Nullable<System.DateTime> Data { get; set; }
public virtual ReceitaCusto ReceitaCusto { get; set; }
public virtual ReceitaDificuldade ReceitaDificuldade { get; set; }
public virtual ReceitaGastronomia ReceitaGastronomia { get; set; }
public virtual ReceitaTipo ReceitaTipo { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<ReceitaImagem> ReceitaImagem { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<ReceitaIngrediente> ReceitaIngrediente { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<ReceitaNota> ReceitaNota { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<ReceitaPasso> ReceitaPasso { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<ReceitaTag> ReceitaTag { get; set; }
public virtual AspNetUsers AspNetUsers { get; set; }
public virtual DosesUnidade DosesUnidade { get; set; }
}
我没有向控制器添加任何东西(并且很惊讶EF为我做了所有SelectLists,太棒了!)但是这里是:
// GET: Receitas/Create
[HttpGet]
[Authorize]
public ActionResult Create()
{
ViewBag.ReceitaCustoID = new SelectList(db.ReceitaCusto.OrderBy(x => x.ReceitaCustoID), "ReceitaCustoID", "Descricao");
ViewBag.ReceitaDificuldadeID = new SelectList(db.ReceitaDificuldade.OrderBy(x => x.ReceitaDificuldadeID), "ReceitaDificuldadeID", "Descricao");
ViewBag.ReceitaGastronomiaID = new SelectList(db.ReceitaGastronomia.OrderBy(x => x.Descricao), "ReceitaGastronomiaID", "Descricao");
ViewBag.ReceitaTipoID = new SelectList(db.ReceitaTipo.OrderBy(x => x.Descricao), "ReceitaTipoID", "Descricao");
ViewBag.DosesUnidadeID = new SelectList(db.DosesUnidade.OrderBy(x => x.Descricao), "DosesUnidadeID", "Descricao");
return View("Create", "_MainLayout");
}
对于观点,我试图做一些像:
<div class="row">
@foreach (var passo in Model.ReceitaPasso)
{
<div class="col-sm-12">
@Html.LabelFor(model => passo.Descricao, htmlAttributes: new { @class = "control-label" })
@Html.EditorFor(model => passo.Descricao, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => passo.Descricao, "", new { @class = "text-danger" })
</div>
}
</div>
但是我在Model.ReceitaPasso中得到一个NullReferenceException,可能是因为我应该将一些东西传递给视图。
那么,有什么指导吗?
编辑:似乎如果要编辑配方本身,我会使用这些步骤进行局部视图,并且应该易于实现。在这种情况下,我还没有RecipeID(ReceitaID),这对我来说是个挑战。