Почему данные моей модели очищаются в POST - PullRequest
0 голосов
/ 24 октября 2019

Извините, если это закончится простым или глупым вопросом, я очень новичок в MVC и Razor, меня бросают в глубокий конец без формального обучения чему-либо текущему ...

Я не знаюЯ не понимаю, почему данные в моей модели доступны в моем первом представлении, а во втором - нет.

Контроллер инициирует экземпляр модели, используя код

Product _Product = new Product();

, затем первое представление вызывается после выполнения набора начальных запросов данных. Представление вызывается с помощью

return View("Attributes", _Product)

, чтобы вызвать представление, передающее ему экземпляр _Product модели.

Мое первое представление делает много вещей, но в отношении этого вопроса оно показывает таблицу с использованием строки foreachв наборе данных, заполненном SQL на контроллере, хранящемся в модели.

@foreach(DataRow row in Model.attList.Tables[0].Rows)

Представление имеет несколько кнопок, таких как добавление, удаление, редактирование ... Каждому назначено собственное действие, например

<input type="submit" class="btn btn-primary" name="action:btnDelete" value="Delete" />

Если пользователь нажимает одну из кнопок в этом представлении, которая вызывает HTTPPOST. Один из них вызывает новое представление, но если я снова передам свою модель этому представлению, данные будут пустыми? Я передаю модель представлению, принимаю ее в HTTPPOST и передаю ее следующему представлению (или так я думал).

Я использую очень общее начало для формирования

@using (Html.BeginForm()) {

Код в контроллере для этой кнопки очень простой

[HttpPost] 
[MultipleButton(Name = "action", Argument = "btnEditValues")] 
public ActionResult btnEditValues(Product _Product) 
{ 
    return View("btnEditValues", _Product); 
}

Но тогда в этом втором представлении, еслиЯ пытаюсь повторно отобразить ту же таблицу, теперь она говорит, что мой Model.attList пуст. Я добавил быстрый скрипт console.log(@Model.attList);, и когда я нажимаю кнопку, он показывает 2-й вид, но консоль записывает пустое значение (не NULL, просто пусто) ...

Я уверен, что я 'Мне просто не хватает чего-то простого - или, может быть, я пытаюсь сделать что-то, чего не могу ???

Следующее было скопировано / вставлено, без редактирования, в этот вопрос из ошибочно размещенного «ответа», который предназначался для редактирования вопроса. Ответ был помечен и должен быть удален.

По запросу Дэвида.

Здесь приведены полные M, V, V и C (не включая другие 2 представления, которые они надеваютне использовать модель и оба работают) ...

!!! ПРИМЕЧАНИЕ !!! : этот код используется везде, где у каждого есть менеджер SQL и права администратора на сервер SQL. Как таковые параметры SQL не использовались. Этот код будет уязвим для внедрения SQL, если используется на открытом веб-сайте.

Модель

namespace P21.Rules.Visual.Areas.KCDA_ItemMaint_Attributes.Models
{
    public class Product
    {
        // Variables used between views
        public int RowSelected { get; set; }

        // Declare datasets to use as list
        public DataSet attList { get; set; }
        public DataSet lowList { get; set; }
    }
}

Контроллер

namespace P21.Rules.Visual.Areas.KCDA_ItemMaint_Attributes.Controllers
{
    #region Multiple Buttons
    [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
    public class MultipleButtonAttribute : ActionNameSelectorAttribute
    {
        public string Name { get; set; }
        public string Argument { get; set; }

        public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo)
        {
            var isValidName = false;
            var keyValue = string.Format("{0}:{1}", Name, Argument);
            var value = controllerContext.Controller.ValueProvider.GetValue(keyValue);

            if (value != null)
            {
                controllerContext.Controller.ControllerContext.RouteData.Values[Name] = Argument;
                isValidName = true;
            }

            return isValidName;
        }
    }
    #endregion


    public class KCDA_ItemMaint_AttributesController : BaseRuleController
    {
        #region public variables
        // public dataset for loading SQL values
        DataSet attload = new DataSet();
        DataSet lowload = new DataSet();
        #endregion

        #region Main Action
        // GET: KCDA_ItemMaint_Attributes/KCDA_ItemMaint_Attributes
        public ActionResult Attributes()
        {

            if (Data.Fields["item_id"].FieldValue == string.Empty)
            {
                // Report error and prevent form pop-up if no product group has been selected
                Rule.RuleResult.Success = false;
                Rule.RuleResult.Message = "You must first select an Item before listing Attributes";
                return RedirectToAction("Close", "Initialize", new { area = "" });
            }
            else
            {

                try
                {
                    // Create container and setup Group values
                    Product _Product = new Product();

                    //Get Attributes for selected item
                    LoadAttributes();
                    _Product.attList = attload.Copy();

                    //Get ECom Server Side Attribute for selected item
                    LoadLower();
                    _Product.lowList = lowload.Copy();

                    return View("Attributes", _Product);

                }
                catch (Exception ex)
                {
                    //catch the error and send it to the Error view with the HandleErrorInfo
                    return View("Error", new HandleErrorInfo(ex, "KCDA_ItemMaint_Attributes", "Attributes"));
                }

            }
        }
        #endregion

        #region Buttons
        [HttpPost]
        [MultipleButton(Name = "action", Argument = "btnDelete")]
        public ActionResult btnDelete(Product _Product)
        {
            // create SQL command to delete the 
            string sqlDelete = "UPDATE BL_ProductAttribute SET DeleteFlag = '1' WHERE [KEY] = '" + _Product.RowSelected + "'";

            // Run the sqlDELETE command
            SqlCommand cmdDelete = new SqlCommand(sqlDelete, P21SqlConnection);
            cmdDelete.ExecuteNonQuery();
            SqlDataAdapter daDelete = new SqlDataAdapter(cmdDelete);

            return View("btnDelete", _Product);
        }

        [HttpPost]
        [MultipleButton(Name = "action", Argument = "btnAdd")]
        public ActionResult btnAdd(Product _Product)
        {
            // Retrieve selected/loaded drop-down values
            string ddGroup = Request["ApplyGroup"];
            string ddName = Request["AttributeName"];
            string ddValue = Request["AttributeValue"];

            if (ddValue == "")
            {
                ViewBag.msg = "No Value Selected";
            }
            else
            {
                // default duplicate count to 0
                int duplicate = 0;

                // create SQL command to check for duplicate attribute 
                string sqlDuplicate = "SELECT COUNT(1) FROM BL_ProductAttribute " +
                                      "WHERE SKU = '" + Data.Fields["item_id"].FieldValue + "' " +
                                      "AND AttributeGroupName = '" + ddGroup + "'";

                // Run the sqlDuplicate command
                SqlCommand cmdDuplicate = new SqlCommand(sqlDuplicate, P21SqlConnection);
                cmdDuplicate.CommandType = CommandType.Text;
                SqlDataAdapter daDuplicate = new SqlDataAdapter(cmdDuplicate);

                // Create dataset from duplicate check
                DataTable dupcheck = new DataTable();
                daDuplicate.Fill(dupcheck);

                // Set count if exists
                duplicate = int.Parse(dupcheck.Rows[0][0].ToString());

                // if exists update/undelete otherwise insert
                if (duplicate > 0)
                {
                    // create SQL command to update the attribute 
                    string sqlAdd = "UPDATE BL_ProductAttribute " +
                                    "SET BL_ProductAttribute.Value = '" + ddValue.Replace("'", "''") + "', " +
                                    "BL_ProductAttribute.AttributeTitle = '" + ddName + "', " +
                                    "BL_ProductAttribute.DeleteFlag = 0, " +
                                    "BL_ProductAttribute.ProductID = '" + Data.Fields["product_group_id"].FieldValue + "' " +
                                    "FROM BL_ProductAttribute " +
                                    "WHERE SKU = '" + Data.Fields["item_id"].FieldValue + "' AND AttributeGroupName = '" + ddGroup + "' ";

                    // Run the sqlAdd command
                    SqlCommand cmdAdd = new SqlCommand(sqlAdd, P21SqlConnection);
                    cmdAdd.ExecuteNonQuery();
                    SqlDataAdapter daAdd = new SqlDataAdapter(cmdAdd);

                    ViewBag.msg = "Record Updated";
                }
                else
                {
                    // If adding determine next key value for unique ID
                    string newKey = string.Empty;

                    // create SQL command to get next KEY value for insert reset current maxkey
                    string sqlMax2 = "SELECT max([key])+1 FROM BL_AttributeEnumValue";

                    // Run the sqlMax command
                    SqlCommand cmdKey2 = new SqlCommand(sqlMax2, P21SqlConnection);
                    cmdKey2.CommandType = CommandType.Text;
                    SqlDataAdapter daKey2 = new SqlDataAdapter(cmdKey2);

                    // Create dataset from newKey check and assign to newKey 
                    DataTable KeyCheck2 = new DataTable();
                    daKey2.Fill(KeyCheck2);
                    newKey = KeyCheck2.Rows[0][0].ToString();

                    // create SQL command to update the attribute 
                    string sqlAdd = "INSERT INTO BL_ProductAttribute ([Key], ProductId, SKU, AttributeTitle, " +
                                    "isSKUlevel, isRequired, isDefault, Value, AttributeGroupName, DeleteFlag) " +
                                    "VALUES('" + newKey + "', '" + Data.Fields["product_group_id"].FieldValue + "', '" +
                                    Data.Fields["item_id"].FieldValue + "', '" + ddName + "', 1, 1, 1, '" +
                                    ddValue.Replace("'", "''") + "', '" + ddGroup + "', 0)";

                    // Run the sqlAdd command
                    SqlCommand cmdAdd = new SqlCommand(sqlAdd, P21SqlConnection);
                    cmdAdd.ExecuteNonQuery();
                    SqlDataAdapter daAdd = new SqlDataAdapter(cmdAdd);

                    ViewBag.msg = "Record Added";
                }

            }

            return View("btnAdd", _Product);
        }

        [HttpPost]
        [MultipleButton(Name = "action", Argument = "btnEditValues")]
        public ActionResult btnEditValues(Product _Product)
        {
            return View("btnEditValues", _Product);
        }
        #endregion

        #region SQL Loads
        private void LoadAttributes()
        {          
            // Define SQL select command
            string sqlAttributes = "SELECT * FROM BL_ProductAttribute " +
                                   "WHERE SKU = '" + Data.Fields["item_id"].FieldValue + "' AND DeleteFlag = '0' " +
                                   " AND AttributeGroupName in ('SKU_Color', 'SKU_SelectableAttribute_1', 'SKU_SelectableAttribute_2')";

            // Set SQL command type to text and run it
            SqlCommand cmdlist = new SqlCommand(sqlAttributes, P21SqlConnection);
            cmdlist.CommandType = CommandType.Text;
            SqlDataAdapter dalist = new SqlDataAdapter(cmdlist);

            // Load results from SQL into DataSet
            dalist.Fill(attload);
        }

        private void LoadLower()
        {           
            string DBconn = "vsldb1";

            // Define SQL select command
            string sqllist = "SELECT [Key], ProductID, SKU, AttributeTitle, isSKUlevel, isRequired, isDefault, " +
                                    "\"Value\" = Case " +
            "when (AttributeTitle = 'KCDASKUStatus' and ltrim(convert(varchar,Value)) = '0') then '0 - Warehouse Regular Item' " +
            "when (AttributeTitle = 'KCDASKUStatus' and ltrim(convert(varchar,Value)) = '1') then '1 - Not on Website/Pending' " +
            "when (AttributeTitle = 'KCDASKUStatus' and ltrim(convert(varchar,Value)) = '2') then '2 - RFQ' " +
            "when (AttributeTitle = 'KCDASKUStatus' and ltrim(convert(varchar,Value)) = '3') then '3 - Limited Quote' " +
            "when (AttributeTitle = 'KCDASKUStatus' and ltrim(convert(varchar,Value)) = '4') then '4 - Discontinued/Obsolete' " +
            "when (AttributeTitle = 'KCDASKUStatus' and ltrim(convert(varchar,Value)) = '5') then '5 - Specials' " +
            "when (AttributeTitle = 'KCDASKUStatus' and ltrim(convert(varchar,Value)) = '6') then '6 - Direct Ship' " +
            "when (AttributeTitle = 'KCDASKUStatus' and ltrim(convert(varchar,Value)) = '7') then '7 - Offline' " +
            "else value end, AttributeGroupName, UpdateFlag  FROM OPENDATASOURCE('SQLOLEDB','Data Source=" + DBconn + ";user " +
                                   "id=sa;password=KCDAAdmin').KCDA.dbo.KCDA_ProductAttribute PA" +
                                   " WHERE PA.SKU = '" + Data.Fields["item_id"].FieldValue + "' AND PA.AttributeGroupName not in " +
                                   "('SKU_Color', 'SKU_SelectableAttribute_1', 'SKU_SelectableAttribute_2')";

            // Set SQL command type to text and run it
            SqlCommand cmdlist = new SqlCommand(sqllist, P21SqlConnection);
            cmdlist.CommandType = CommandType.Text;
            SqlDataAdapter dalist = new SqlDataAdapter(cmdlist);

            // Load results from SQL into DataSet
            dalist.Fill(lowload);
        }
        #endregion

        #region Drop Downs
        [HttpPost]
        public ActionResult GetAttributeNames(string selectedOption)
        {

            // Define variables for JSON query to use
            JsonResult result = new JsonResult();
            List<string> attNames = new List<string>();
            List<string> attValues = new List<string>();

            if (selectedOption != null)
            {
                // SQL to get attribute name for the selected attribute group for this product group 
                string sql = "SELECT Title FROM BL_Attribute (NOLOCK) WHERE BL_Attribute.DeleteFlag = '0' AND BL_Attribute.AttributeGroupName = '" + selectedOption + "'" +
                                 " AND BL_Attribute.Title in (select AD.AttributeTitle from BL_AttributeDept AD where AD.product_group_id = '" + Data.Fields["product_group_id"].FieldValue.Substring(0, 2) +"')";

                using (SqlCommand selectAttNames = new SqlCommand(sql, P21SqlConnection))
                {
                    using (SqlDataReader reader = selectAttNames.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            attNames.Add(reader["Title"].ToString());
                        }            
                    }
                }

                // SQL to get list of current available values for this attribute type
                string sql2 = "SELECT Value FROM BL_AttributeEnumValue (NOLOCK) WHERE DeleteFlag = '0' and AttributeTitle = '" + 
                              attNames[0] + "' ORDER BY Value";

                using (SqlCommand selectAttValues = new SqlCommand(sql2, P21SqlConnection))
                {
                    using (SqlDataReader reader2 = selectAttValues.ExecuteReader())
                    {
                        while (reader2.Read())
                        {
                            attValues.Add(reader2["Value"].ToString());
                        }
                    }
                }

                // define return object 
                var retObj = new
                {
                    retNames = attNames,
                    retValues = attValues
                };
                return Json(retObj, JsonRequestBehavior.AllowGet);

            }

            return Json(new { Success = "false" });
        }


        #endregion

        #region Edit Values



        #endregion

        #region Close Rule
        [HttpPost]
        public ActionResult Return()
        {
            Rule.RuleResult.Success = true;

            //IMPORTANT - This is what returns the Visual Rule control back to the server
            //DO NOT REMOVE
            return RedirectToAction("Close", "Initialize", new { area = "" });
        }
        #endregion
    }

}

Просмотр атрибутов

@using P21.Rules.Visual.Areas.KCDA_ItemMaint_Attributes.Models
@using System.Data


@model Product


@{
    ViewBag.Title = "Attributes";
    Layout = "~/Views/Shared/_VisualRuleLayout.cshtml";

    var listAttGroups = new List<SelectListItem>
    {
        new SelectListItem { Text = "SKU_Color", Value = "SKU_Color"},
        new SelectListItem { Text = "SKU Select Att 1", Value = "SKU_SelectableAttribute_1"},
        new SelectListItem { Text = "SKU Select Att 2", Value = "SKU_SelectableAttribute_2"}
    };
}

@section scripts{
    <script>
        $(function () {
            $("#ApplyGroup").change(function () {
                var option = $(this).val();

                //Clear and activate 2nd and 3rd drop down
                $("#AttributeName").empty();
                $("#AttributeValue").empty();
                $("#AttributeName").prop('disabled', false);
                $("#AttributeValue").prop('disabled', false);

                var url = "GetAttributeNames?selectedOption=" + option;

                $.post(url, function (retObj) {
                    $.each(retObj.retNames, function (i, attName) {
                        $("#AttributeName").append($('<option></option>').val(attName).html(attName));
                    });
                    $.each(retObj.retValues, function (i, attValue) {
                        $("#AttributeValue").append($('<option></option>').val(attValue).html(attValue));
                    });
                });
            });
        });
    </script>
}

@using (Html.BeginForm())
{
        <div class="container">
        <div class="row">
            <label class="col-md-3 control-label" for="ApplyGroup" id="lblApplyGroup">Attribute Group</label>
            <label class="col-md-3 control-label" for="AttributeName" id="lblAttributeName">Attribute Name</label>
            <label class="col-md-2 control-label" for="AttributeValue" id="lblAttributeValue">Attribute Value</label>
            <div class="col-md-2">
                <input type="submit" class="btn btn-primary" name="action:btnEditValues" value="Edit Values" />
            </div>
        </div>
        <div class="row" style="padding-top:5px">
            <div class="col-md-3">
                @Html.DropDownList("ApplyGroup", listAttGroups, "Select Group", new { @id = "ApplyGroup", @class = "form-control" })
            </div>
            <div class="col-md-3">
                @Html.DropDownList("AttributeName", new List<SelectListItem>(), new { @id = "AttributeName", @class = "form-control", disabled = "disabled" })
            </div>
            <div class="col-md-3">
                @Html.DropDownList("AttributeValue", new List<SelectListItem>(), new { @id = "AttributeValue", @class = "form-control", disabled = "disabled" })
            </div>
            <div class="col-md-3">
                <span class="pull-right">
                    <input type="submit" class="btn btn-primary" name="action:btnAdd" value="Add\Update" />
                </span>
            </div>
        </div>
        <div class="row" style="padding-top:20px">
            <div class="col-md-10">

            </div>
            <div class="col-md-2">
                <span class="pull-right">
                    <input type="submit" class="btn btn-primary" name="action:btnDelete" value="Delete" />
                </span>
            </div>
        </div>

        <div class="row" style="padding-top:10px">
            <div class="col-md-12">
                <table id="attTable" style="width:100%" cellpadding="0" cellspacing="0" border="1" class="row">
                    <tbody>
                        <tr style="background-color: #F0F8FF;">
                            <th></th>
                            <th>Dept</th>
                            <th>Item #</th>
                            <th>Attribute Name</th>
                            <th>SKU Level</th>
                            <th>Required</th>
                            <th>Default</th>
                            <th>Attribute Value</th>
                            <th>Attribute Group</th>
                        </tr>
                        @foreach (DataRow row in Model.attList.Tables[0].Rows)
                        {
                            <tr class="selectable-row">
                                <td>@Html.RadioButtonFor(m => Model.RowSelected, row[0])</td>
                                <td>@row[1]</td>
                                <td>@row[2]</td>
                                <td>@row[3]</td>
                                <td>@row[4]</td>
                                <td>@row[5]</td>
                                <td>@row[6]</td>
                                <td>@row[7]</td>
                                <td>@row[8]</td>
                            </tr>
                        }
                    </tbody>
                </table>
            </div>
        </div>

        <div class="row" style="padding-top:50px">
            <div class="col-md-12">
                <table id="lowTable" style="width:100%" cellpadding="0" cellspacing="0" border="1" class="row">
                    <tbody>
                        <tr style="background-color: #F0F8FF;">
                            <th>Dept</th>
                            <th>Item #</th>
                            <th>Attribute Name</th>
                            <th>SKU Level</th>
                            <th>Required</th>
                            <th>Default</th>
                            <th>Attribute Value</th>
                            <th>Attribute Group</th>
                        </tr>
                        @foreach (DataRow row in Model.lowList.Tables[0].Rows)
                        {
                            <tr class="selectable-row">
                                <td>@row[1]</td>
                                <td>@row[2]</td>
                                <td>@row[3]</td>
                                <td>@row[4]</td>
                                <td>@row[5]</td>
                                <td>@row[6]</td>
                                <td>@row[7]</td>
                                <td>@row[8]</td>
                            </tr>
                        }
                    </tbody>
                </table>
            </div>
        </div>
    </div>
}

btnEditValues ​​Просмотр

@using P21.Rules.Visual.Areas.KCDA_ItemMaint_Attributes.Models
@using System.Data


@model Product

@{
    ViewBag.Title = "btnEditValues";
    Layout = "~/Views/Shared/_VisualRuleLayout.cshtml";

    var listAttGroups = new List<SelectListItem>
    {
        new SelectListItem { Text = "SKU_Color", Value = "SKU_Color"},
        new SelectListItem { Text = "SKU Select Att 1", Value = "SKU_SelectableAttribute_1"},
        new SelectListItem { Text = "SKU Select Att 2", Value = "SKU_SelectableAttribute_2"}
    };
}

@section scripts{
    <script>
        console.log(@Model.attList);
    </script>
}

<p align="right"><button type="button" class="btn btn-primary" onclick="location.href='@Url.Action("Attributes", "KCDA_ItemMaint_Attributes")'">X</button></p>
<center><h2>Edit Item Attribute Availble Values</h2></center>

@using (Html.BeginForm())
{
    <div class="container">
        <div class="row">
            <label class="col-md-4 control-label" for="EditApplyGroup" id="lblEApplyGroup">Attribute Group</label>
            <label class="col-md-4 control-label" for="EditAttributeName" id="lblEAttributeName">Attribute Name</label>
        </div>
        <div class="row" style="padding-top:5px">
            <div class="col-md-4">
                @Html.DropDownList("EditApplyGroup", listAttGroups, "Select Group", new { @id = "EditApplyGroup", @class = "form-control" })
            </div>
            <div class="col-md-4">
                @Html.DropDownList("EditAttributeName", new List<SelectListItem>(), "Select Name", new { @id = "EditAttributeName", @class = "form-control", disabled = "disabled" })
            </div>
        </div>

        <div class="row" style="padding-top:10px">
            <div class="col-md-12">
                <table id="attEditTable" style="width:100%" cellpadding="0" cellspacing="0" border="1" class="row">
                    <tbody>
                        <tr style="background-color: #F0F8FF;">
                            <th></th>
                            <th>Attribute Value</th>
                            <th>Item Count</th>
                        </tr>
                    </tbody>
                </table>
            </div>
        </div>
    </div>
}

Ответы [ 2 ]

2 голосов
/ 25 октября 2019

Если ваш последний вопрос: «Как я могу опубликовать эту модель со всеми ее данными?»,

public class Product
{
    // Variables used between views
    public int RowSelected { get; set; }

    // Declare datasets to use as list
    public DataSet attList { get; set; }
    public DataSet lowList { get; set; }
}

, то единственный реальный ответ - «с МНОГО работы». Следующий ответ, вероятно, в основном самоуверенный, поэтому не очень хороший ответ SO, но отражает мой опыт.

По сути, это действие контроллера:

[HttpPost] 
[MultipleButton(Name = "action", Argument = "btnEditValues")] 
public ActionResult btnEditValues(Product _Product) 
{ 
    // ... other code

    return View("btnEditValues", _Product); 
}

ожидает, что связыватель модели сможетпостроить экземпляр класса Product. Для этого необходимо, чтобы каждое открытое свойство присутствовало в виде значения формы в HTTP-запросе, который был сделан этому действию контроллера. Эти значения формы происходят от так называемых успешных элементов управления , которые в основном представляют собой любой элемент формы (<input />, <select> или <textarea>, как правило), который имеет имя (атрибут name="propertynamehere"). Если поле отсутствует, его значение не существует.

Учитывая, насколько сложен класс DataSet, я бы не советовал пытаться построить достаточно полей формы, чтобы успешно вернуть ваши данные из подшивки модели. Единственное, о чем вы действительно должны заботиться, это RowSelected - это позволяет вам получать нужные данные из базы данных. Учитывая, что SQL-соединение и запрос, как правило, довольно быстрые, это, вероятно, также удобнее для пользователя, поскольку публикация достаточного количества данных для повторного заполнения DataSet требует МНОГО значений форм (вы можете даже столкнуться с проблемой, превышающей максимально допустимое число). полей, хотя это настраивается в ASP.NET). Если это имеет смысл и звучит выполнимо, я могу рассказать о том, как реорганизовать хотя бы это действие, чтобы оно соответствовало принципу работы MVC.

В качестве примечания, если цель состоит в том, чтобы перевести пользователя на страницу редактирования, это имеет больше смысла как запрос GET;загрузка экрана редактирования - это идемпотентное действие, которое соответствует семантике GET. Обычно POST предназначен для обновления значений, чего вы там не делаете.

Вы можете найти это полезным, поскольку он описывает рекомендуемый шаблон (PRG или POST-Redirect-GET): https://en.wikipedia.org/wiki/Post/Redirect/Get

Конечно, если материал, который вы изучаетеfrom находится на более старой стороне, ASP.NET (через WebForms) использовал POST для передачи того, что называется ViewState , которое использовалось / используется для создания иллюзии состояния в веб-приложении - идея была «Windows Forms»для Интернета ", но это добавляет много накладных расходов, которые вы действительно не хотите в современном приложении. Однако, учитывая ваш опыт, он (WebForms) может быть более подходящим, поскольку позволяет сосредоточиться на модели разработки, управляемой событиями.

1 голос
/ 25 октября 2019

В форме нет данных для построения модели.

Сделайте шаг назад и рассмотрите запросы HTTP. HTML <form> при отправке запрашивает URL-адрес действия (в данном случае POST-запрос) и включает в себя все значения формы , присутствующие в этой форме. Это, вероятно, не включает отключенные элементы формы. (Я могу ошибаться в этом.) И это определенно не включает HTML-код формы.

(Вы указали, что не пришли из фона WebForms, нопо совпадению это очень распространенная ошибка для тех, кто это сделал.)

За исключением кнопок, единственными элементами формы, которые я вижу, являются три раскрывающихся списка (ApplyGroup, AttributeName, AttributeValue), а также переключаемые в цикле переключатели, называемые RowSelected.

Но для создания модели требуется больше значений:

public int RowSelected { get; set; }

// Declare datasets to use as list
public DataSet attList { get; set; }
public DataSet lowList { get; set; }

Модель имеет RowSelected и вы можете выполнить отладку, чтобы подтвердить, правильно ли заполнено это значение. (Ваш вопрос указывает только на то, что вы пытаетесь отладить наличие свойств DataSet, а не свойства RowSelected.)

Но включение всех данных из двух свойств DataSet будет гораздо более сложным,И, может быть, более конкретно, было бы совершенно ненужным. Сделайте шаг назад и подумайте, что вы будете заполнять страницу данными, которые пользователь не ожидает отредактировать, а затем отправлять все эти данные обратно на сервер, с которого они только что пришли.

Inсвоим действием вы можете получить это свойство RowSelected различными способами. В качестве аргумента метода, в качестве свойства модели или просто так, как вы в настоящее время получаете значения формы в других ваших методах действия:

string rowSelected = Request["RowSelected"];

Вы можете использовать int.TryParse(), чтобы преобразовать это в целочисленное значение, если это необходимо. Хотя используемый вами код SQL является конкатенацией строк, вам, возможно, не понадобится.

(Примечание: хорошо, что вы уже знаете, что внедрение SQL - это плохо. в случае, если это не обязательно проблема security , имейте в виду, что SQL-инъекция также является очень распространенным источником ошибок. Стоит изучить правильный способ действий.)

Если вы можете получитьполностью заполненная модель из базы данных с использованием идентификатора, которая была бы идеальной. Конечно, легче просто передать идентификатор, чем обойти всю сложную модель, особенно если вы не ожидаете, что пользователь отредактирует эту модель на этой странице.

В целом, похоже,вы просто ожидаете, что вся модель будет опубликована на сервере, тогда как на самом деле все, что вы публикуете - это идентификатор модели. К счастью, это все, что вам действительно нужно. Просто используйте этот идентификатор, чтобы получить нужную запись.

...