创建发布多个模型的函数

时间:2017-10-11 12:17:55

标签: c# razor asp.net-core asp.net-core-mvc

我正在开发一个.NET Core 2.0应用程序,我有一个包含两个不同模型的实例的单个视图, Component Value 。我想创建这些模型的所有实例并将其发布到数据库中,但我无法将它们全部发布。目前只有两个模型的第一个实例(行)被发布到Db。

所以我的问题:是否可以做这样的事情?如果是这样的话,怎么样?

以下是我的代码中的几个示例。

我的ViewModel:

public class SheetData
{
    public int ID { get; set; }

    public Sheet Sheet { get; set; }
    public Component Components { get; set; }
    public Values Values { get; set; }
}

Razorview :(只有整个视图的一小部分样本)

<div class="row">
        <div class="form-group">
            <div class="col-md-4">
                <span>
                    <label asp-for="Components.Name" class="control-label"></label>
                    <input asp-for="Components.Name" class="form-control" value="UpperAnnular" readonly />
                </span>
            </div>
            <div class="col-md-1">
                <span>
                    <label asp-for="Values.OpenTime" class="control-label"></label>
                    <input asp-for="Values.OpenTime" class="form-control" />
                </span>
            </div>
            <div class="col-md-1">
                <span>
                    <label asp-for="Values.OpenGal" class="control-label"></label>
                    <input asp-for="Values.OpenGal" class="form-control" />
                </span>
            </div>
            <div class="col-md-1">
                <span>
                    <label asp-for="Values.CloseTime" class="control-label"></label>
                    <input asp-for="Values.CloseTime" class="form-control" />
                </span>
            </div>
            <div class="col-md-1">
                <span>
                    <label asp-for="Values.CloseGal" class="control-label"></label>
                    <input asp-for="Values.CloseGal" class="form-control" />
                </span>
            </div>
        </div>
    </div>


    <div class="row">
        <div class="form-group">
            <div class="col-md-4">
                <span>
                    <label asp-for="Components.Name" class="control-label"></label>
                    <input asp-for="Components.Name" class="form-control" value="LowerAnnular" readonly />
                </span>
            </div>
            <div class="col-md-1">
                <span>
                    <label asp-for="Values.OpenTime" class="control-label"></label>
                    <input asp-for="Values.OpenTime" class="form-control" />
                </span>
            </div>
            <div class="col-md-1">
                <span>
                    <label asp-for="Values.OpenGal" class="control-label"></label>
                    <input asp-for="Values.OpenGal" class="form-control" />
                </span>
            </div>
            <div class="col-md-1">
                <span>
                    <label asp-for="Values.CloseTime" class="control-label"></label>
                    <input asp-for="Values.CloseTime" class="form-control" />
                </span>
            </div>
            <div class="col-md-1">
                <span>
                    <label asp-for="Values.CloseGal" class="control-label"></label>
                    <input asp-for="Values.CloseGal" class="form-control" />
                </span>
            </div>
        </div>
    </div>

控制器:

// GET:
    public IActionResult Sheet ()
    {
        var model = new SheetData();
        model.Sheet = new Sheet();
        model.Components = new Component();
        model.Values = new Values();
        //model.Events = new Event();

        return View(model);
    }


    // POST: Sheet/Create
    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Sheet(SheetData viewModel)
    {
        Sheet sheet = viewModel.Sheet;
        Component component = viewModel.Components;
        Values values = viewModel.Values;

        if (ModelState.IsValid)
        {

            //values.ComponentID = component.ComponentID;

            _context.Add(sheet);
            //await _context.SaveChangesAsync();

            _context.Add(values);
            //await _context.SaveChangesAsync();

            component.SheetID = sheet.ID;
            component.ValuesID = values.ID;

            _context.Add(component);
            await _context.SaveChangesAsync();

            return RedirectToAction(nameof(Index));
        }

        return RedirectToAction(nameof(Index));
    }

2 个答案:

答案 0 :(得分:0)

Values属性必须是集合(例如,List)。 然后在Razor页面上,您可以通过索引指向每个元素:

            <span>
                <label asp-for="Values[0].OpenTime" class="control-label"></label>
                <input asp-for="Values[0].OpenTime" class="form-control" />
            </span>

答案 1 :(得分:0)

也许我只是懒惰,但我发现直接使用数据库比制作更多视图模型更清晰。

我通常将模型添加到“主”模型中,如virtual,然后在存储库中,我只包含它:return: db.Components.Include(C => C.Values)

这允许我在视图中使用其他模型,只要我想在每次添加时添加.Values