第一个动态形式的MVC项目

时间:2018-01-21 16:15:45

标签: c# asp.net-mvc entity-framework

我是从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),这对我来说是个挑战。

0 个答案:

没有答案