Нужно, чтобы ASP.NET MVC создавал страницу представления, чтобы изменить предоставляемую пользователем информацию на значения внешнего ключа - PullRequest
0 голосов
/ 07 июня 2019

Я работаю над созданием веб-сайта, который обращается к таблице в SQL Management Server. Пользователь должен иметь возможность просматривать, редактировать, удалять и создавать новые записи в таблице, используя мой сайт. Используемая таблица называется DeviceUnderTest и имеет следующие столбцы: DeviceUnderTest (pk), DeviceUnderTest (nk), Notes (nk), FaultApplication (fk), Firmware (fk), Hardware (fk), Power (fk), Местоположение (fk), PreEventTime (nk), HandleRate (nk). До сих пор я создал модель, которая подключается к основной таблице DeviceUnderTest, а также к другим таблицам, на которые ссылаются столбцы внешнего ключа. Я создал контроллер, а также индекс, детали, удалить и создать страницу просмотра. Мое представление индекса - это таблица, и я выяснил, как заменить все значения внешнего ключа соответствующими таблицами из таблиц, на которые они ссылаются. Одна вещь, которую я не могу понять, это страница создания. Пользователи будут вводить информацию в виде значений, на которые ссылаются столбцы fk, а не самих значений внешних ключей. Я не могу понять, как изменить пользовательский ввод обратно на правильное значение внешнего ключа, чтобы запись могла быть правильно добавлена ​​в таблицу noth на сервере sql, а также на моем сайте. Если у кого-то есть какие-либо предложения, они очень ценятся.

Код контроллера:

// GET: Circuit/Create
        public ActionResult Create()
        {
            return View();
        }

        // POST: Circuit/Create
        [HttpPost]
        public ActionResult Create(DeviceUnderTest device)
        {
            try
            {


                    dbModel.DeviceUnderTests.Add(device);
                    dbModel.SaveChanges();

                    // TODO: Add insert logic here

                    return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }

Создать код просмотра:

@model Template_Website.Models.DeviceUnderTest

@{
    ViewBag.Title = "Create";
}

<h2>Create</h2>

@using (Html.BeginForm()) 
{
    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <h4>DeviceUnderTest</h4>
        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })
        <div class="form-group">
            @Html.LabelFor(model => model.pkDeviceUnderTest, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.pkDeviceUnderTest, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.pkDeviceUnderTest, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.nkDeviceUnderTest, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.nkDeviceUnderTest, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.nkDeviceUnderTest, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.nkNotes, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.nkNotes, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.nkNotes, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.FaultApplication.nkFaultApplication, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.FaultApplication.nkFaultApplication, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.FaultApplication.nkFaultApplication, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.Firmware.nkFirmware, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.Firmware.nkFirmware, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.Firmware.nkFirmware, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.Hardware.nkHardware, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.Hardware.nkHardware, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.Hardware.nkHardware, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.fkPower, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.fkPower, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.fkPower, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.Location.nkLocation, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.Location.nkLocation, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.Location, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.nkPreEventTime, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.nkPreEventTime, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.nkPreEventTime, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.nkHandleRating, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.nkHandleRating, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.nkHandleRating, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <<button type="submit" class="btn btn-default " value="Create" onclick="return confirm('Are you sure?')">Create</button>
            </div>
        </div>
    </div>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

Индекс Просмотр кода:

@model IEnumerable<Template_Website.Models.DeviceUnderTest>

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2> 




<p>
    @Html.ActionLink("Create New", "Create")
</p>
<table class="table">
    <tr>
        <th>

        </th>

        <th>

        </th>
        <th>

        </th>
        <th>

        </th>
        <th>
            @Html.DisplayNameFor(model => model.pkDeviceUnderTest)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.nkDeviceUnderTest)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.nkNotes)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.FaultApplication.nkFaultApplication)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Firmware.nkFirmware)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Hardware.nkHardware)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.fkPower)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Location.nkLocation)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.nkPreEventTime)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.nkHandleRating)
        </th>
        <th></th>
    </tr>

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.CheckBoxFor(modelItem => item.Selected)
        </td>

        <td>
            <input type="button" value="Edit" class="btn btn-default" onclick="@("window.location.href='" + @Url.Action("Edit", "Circuit", new { id = item.pkDeviceUnderTest } ) + "'");" />
        </td>
        <td>
            <input type="button" value="Details" class="btn btn-default" onclick="@("window.location.href='" + @Url.Action("Details", "Circuit", new { id = item.pkDeviceUnderTest }) + "'");" />
        </td>
        <td>
            <input type="button" value="Delete" class="btn btn-danger" onclick="@("window.location.href='" + @Url.Action("Delete", "Circuit", new { id = item.pkDeviceUnderTest }) + "'");" />
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.pkDeviceUnderTest)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.nkDeviceUnderTest)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.nkNotes)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.FaultApplication.nkFaultApplication)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Firmware.nkFirmware)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Hardware.nkHardware)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.fkPower)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Location.nkLocation)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.nkPreEventTime)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.nkHandleRating)
        </td>

    </tr>
}

</table>

Код модели DeviceUnderTest:


namespace Template_Website.Models
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;

    public partial class DeviceUnderTest
    {
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
        public DeviceUnderTest()
        {
            this.TestRecords = new HashSet<TestRecord>();
        }
        public bool Selected { get; set; }
        [Required]    
        public int pkDeviceUnderTest { get; set; }
        [Required]
        public string nkDeviceUnderTest { get; set; }
        [Required]
        public string nkNotes { get; set; }

        public Nullable<int> fkFaultApplication { get; set; }
        public Nullable<int> fkFirmware { get; set; }
        public Nullable<int> fkHardware { get; set; }
        public Nullable<int> fkPower { get; set; }
        public Nullable<int> fkLocation { get; set; }
        public Nullable<int> nkPreEventTime { get; set; }
        public Nullable<int> nkHandleRating { get; set; }

        public virtual FaultApplication FaultApplication { get; set; }
        public virtual Firmware Firmware { get; set; }
        public virtual Hardware Hardware { get; set; }
        public virtual Location Location { get; set; }
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<TestRecord> TestRecords { get; set; }
    }
    public class DeviceUnderTestModel
    {
        public List<DeviceUnderTest> device { get; set; }
    }
}


Код модели оборудования:


namespace Template_Website.Models
{
    using System;
    using System.Collections.Generic;

    public partial class Hardware
    {
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
        public Hardware()
        {
            this.DeviceUnderTests = new HashSet<DeviceUnderTest>();
        }

        public int pkHardware { get; set; }
        public string nkHardware { get; set; }

        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<DeviceUnderTest> DeviceUnderTests { get; set; }
    }
}

Ответы [ 2 ]

0 голосов
/ 10 июня 2019

Точно так же, как говорит user1477388, вы можете использовать выпадающие списки для каждого элемента. Таким образом, представление отображает текст, но возвращаемым значением является идентификатор.

Например, с использованием оборудования. Я использую модель представления, поэтому мы не представляем модели базы данных для представления. ВМ имеет свойства, которые вы хотите в конкретном представлении. В этом случае у нас есть тестируемое устройство, список выбора и HardwareId.

public class DeviceUnderTestViewModel
{    
    public int pkDeviceUnderTest { get; set; }
    [Required]
    public string nkDeviceUnderTest { get; set; }
    [Required]
    public string nkNotes { get; set; }

    public int HardwareId { get; set; } //pkHardware
    public IEnumerable<SelectListItem> HardwareSelectList { get; set; } //dropdown of Hardware
}

В контроллере заполните списки выбора и прикрепите к модели представления:

public ActionResult Index()
{
    DeviceUnderTestViewModel vm = new DeviceUnderTestViewModel();

    vm.HardwareSelectList = db.Hardware.ToList().Select(d => new SelectListItem()
        {
            Text = d.nkHardware,
            Value = d.pkHardware.ToString()
        });

    // populate all the other dropdowns

    return View();
}

В представлении мы отображаем список выбора:

<div class="form-group">
    @Html.LabelFor(model => model.HardwareId)
    @Html.DropDownListFor(model => model.HardwareIdId, Model.HardwareSelectList, "Select Hardware...", new { @class = "form-control" })
    @Html.ValidationMessageFor(model => model.HardwareIdId, "", new { @class = "text-danger" })
</div>

DropDownListFor принимает значение, чтобы установить сначала, здесь мы устанавливаем аппаратный идентификатор, который мы сохраним в DeviceUnderTest как pkHardware, затем у нас есть заполненный список элементов Hard для выпадающего списка, третий - необязательный заполнитель строк, затем наконец, я добавляю класс начальной загрузки для форматирования.

Затем верните модель в контроллер и сохраните ее:

public ActionResult SaveDevice(DeviceUnderTestViewModel model)
{
    using (var db = new dbContext())
    {
        DeviceUnderTest device = new DeviceUnderTest()
        {
            pkHardware = model.HardwareId,
            // continue with other items

         };
        db.Entry<device>.State = EntiyState.Added;
        db.SaveChanges();
    }
    return View();
}
0 голосов
/ 10 июня 2019

Пользователи будут вводить информацию в виде значений, на которые ссылаются столбцы fk, а не сами значения внешнего ключа.

Почему вы хотите избежать использования внешнего ключаценности?Я заметил, что вы используете EditorFor, но вы не можете просто использовать DropdownFor или даже виджет автозаполнения на основе JavaScript?Таким образом, ваши пользователи будут вводить нужный текст, но значения будут отображаться в фоновом режиме.

Пример использования DropdownFor см. В документах MSDN: https://docs.microsoft.com/en-us/aspnet/mvc/overview/older-versions/working-with-the-dropdownlist-box-and-jquery/examining-how-aspnet-mvc-scaffolds-the-dropdownlist-helper

Для примера использования автозаполнения, здесь есть хороший ответ, который использует jQuery UI: Выпадающее меню автозаполнения в MVC5?

Использование первого примера для DropdownFor и применение его кВ вашем коде одно из свойств вашей модели будет по-прежнему выглядеть одинаково:

public Nullable<int> fkFaultApplication { get; set; }

При создании элемента ViewBag, содержащего SelectList, который отображает ваши тексты и значения:

ViewBag.FaultApplicationId = new SelectList(db.FaultApplications, "FaultAppId", "Name");

Наконец, вы можете использовать эти свойства в своем представлении следующим образом:

@Html.DropDownList("FaultApplicationId", String.Empty)

Обратите внимание, что второй параметр, String.Empty, - это текст, который отображается, когда ни один элемент не выбран.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...