Как ссылаться на значение Html.TextBoxFor в действии контроллера (обновление таблицы в asp.net-mvc) - PullRequest
0 голосов
/ 26 января 2019

Я создаю веб-приложение для продаж.Я хочу обновить количество, оставшееся на складе после ввода продаж.Я установил идентификатор для текстового поля и использую идентификатор текстового поля внутри запроса.Я считаю, что делаю это неправильно.

Пожалуйста, смотрите мой код вида и модели ниже.(Я открыт для других способов, как это сделать).

Код My View:

<div class="container" style="width:40%; margin-top:2%">
@using (Html.BeginForm("SaveSales", "Sales", FormMethod.Post))
{

    @Html.DropDownListFor(model => model.Prod_id, ViewBag.SalesName as        SelectList, "--Select Product--", new { id = "ProdIds", @class = "form-control"        })
    <br />
    @Html.TextBoxFor(model => model.Unit_purchase, new { id = "quant", @class = "form-control", @placeholder = "Amount Purchase" })
    <br />
    @Html.TextBoxFor(model => model.Unit_price, new { @class = "form-control", @placeholder = "Unit Price" })
    <br />
    @Html.DropDownListFor(model =>model.Emp_id, ViewBag.EmpName as SelectList, "--select Employee--", new { @class = "form-control" })
    <br />
    //@Html.TextAreaFor(model => model.Dates, new{@placeholder = "Date", @type = "date", @Value = Model.Dates.ToString("yyyy-MM-dd") })
    @Html.EditorFor(model => model.Dates, new { @type = "date" })
    <br />
    <br />

    @Html.DropDownListFor(model => model.Cust_id, ViewBag.CustName as SelectList, "--Select Customer--", new { @class = "form-control" })
    <br />
    <input type="Submit" value=" Submit" />  <input type="reset" value=" Reset" />
}
 </div>

Код моего контроллера (обновление кода запроса начинается с ---- с использованием (SqlConnection……)

    namespace Salesapp.Controllers
     {
     public class SalesController : Controller
      {
        // GET: Sales
        public ActionResult Index()
        {
            return View();
        }

        public ActionResult SalesIndex()
        {
            SalesLayanEntities3 db = new SalesLayanEntities3();
            List<Product> list = db.Products.ToList();
            ViewBag.SalesName = new SelectList(list, "prod_id", "prod_name");

            List<Employee> listi = db.Employees.ToList();
            ViewBag.EmpName = new SelectList(listi, "emp_id", "emp_name");


            List<Customer> listiw = db.Customers.ToList();
            ViewBag.CustName = new SelectList(listiw, "cust_id", "cust_name");

            return View();
        }

        public ActionResult SaveSales(SalesForm model)
        {
            try
            {
                SalesLayanEntities3 db = new SalesLayanEntities3();
                Sales_Record sale_prod = new Sales_Record();

                sale_prod.unit_price = model.Unit_purchase;
                sale_prod.unit_purchase = model.Unit_price;
                sale_prod.prod_id = model.Prod_id;
                sale_prod.emp_id = model.Emp_id;
                sale_prod.Dates = model.Dates;
                sale_prod.cust_id = model.Cust_id;

                db.Sales_Record.Add(sale_prod);
                db.SaveChanges();
                int latestProdId = sale_prod.sales_id;
                TempData["status"] = "Success";

                using (SqlConnection sqlCon = new SqlConnection(@"Data Source=servername;Initial Catalog=SalesLayan;User ID=username;Password=mypassword;"))
                {
                    sqlCon.Open();
                    SqlCommand cmd12 = sqlCon.CreateCommand();
                    cmd12.CommandType = CommandType.Text;
                    cmd12.CommandText = "update product set prod_quantity=prod_quantity-" + quant.Text "where prod_id=" + ProdIds.Text;
                    cmd12.ExecuteNonQuery();
                }

            }

            catch (Exception ex)
            {
                throw ex;


            }
            return RedirectToAction("SalesIndex");
        }
    }  
}

Ответы [ 2 ]

0 голосов
/ 26 января 2019

Глядя на этот раздел:

using (SqlConnection sqlCon = new SqlConnection(@"Data Source=servername;Initial Catalog=SalesLayan;User ID=username;Password=mypassword;"))
{
    sqlCon.Open();
    SqlCommand cmd12 = sqlCon.CreateCommand();
    cmd12.CommandType = CommandType.Text;
    cmd12.CommandText = "update product set prod_quantity=prod_quantity-" + quant.Text "where prod_id=" + ProdIds.Text;
    cmd12.ExecuteNonQuery();
}

Вместо этого сделайте это, чтобы избежать проблем с внедрением sql и повысить производительность:

string sql = "update product set prod_quantity=prod_quantity- @sold_quantity where prod_id= @Prod_ID";
using (var sqlCon = new SqlConnection(@"Data Source=servername;Initial Catalog=SalesLayan;User ID=username;Password=mypassword;"))
using (var cmd = new SqlCommand(sql, sqlCon))
{
    //Have to guess at types and lengths here. Use actual types and lengths from the database
    cmd.Parameters.Add("@sold_quantity", SqlDbType.Int).Value = int.Parse(quant.Text);
    cmd.Parameters.Add("@Prod_ID", SqlDbType.Int).Value = int.Parse(ProdIds.Text);
    sqlCon.Open();
    cmd12.ExecuteNonQuery();
}
0 голосов
/ 26 января 2019

В вашем запросе у вас может быть неправильная ссылка на переменную для вычета количества из запаса.

cmd12.CommandText = "update product set prod_quantity=prod_quantity-" + quant.Text "where prod_id=" + ProdIds.Text;

В строке выше quant.Text может быть неправильная ссылка на переменную.

quant.Text может потребоваться sale_prod.unit_price или model.Unit_purchase

Ваша команда sql устанавливает prod_quantity = prod_quantity - quant.Text.

Однако в * 1016 нет переменной quant.Text* method.

При использовании помощника TextBoxFor он использует имя модели в качестве имени поля ввода:

Пример: TextBoxFor () в Razor View

@model Student

@Html.TextBoxFor(m => m.StudentName, new { @class = "form-control" })  

Результат HTML:

<input class="form-control" 
        id="StudentName" 
        name="StudentName" 
        type="text" 
        value="John" />

TextBoxFor

TextBoxFor вспомогательный метод является строго типизированным методом расширения.Он генерирует текстовый элемент ввода для свойства модели, указанного с помощью лямбда-выражения.Метод TextBoxFor связывает указанное свойство объекта модели с вводимым текстом.Таким образом, он автоматически отображает значение свойства модели в текстовом поле и наоборот.

Ссылка:

Когда форма отправляется обратно .NET MVC объединяет значения формы в тип параметра Action, используя так называемую привязку модели:

ASP.NET MVCпривязка модели позволяет сопоставить данные HTTP-запроса с моделью.Это процесс создания .NET-объектов с использованием данных, отправляемых браузером в HTTP-запросе.Разработчики ASP.NET Web Forms, которые являются новичками в ASP.Net MVC, в основном путаются, как значения из View преобразуются в класс Model, когда он достигает метода Action класса Controller, поэтому это преобразование выполняется средством связывания Model.

Ссылка

По отношению к Джоэлс примечание: при передаче параметров в оператор sql рекомендуется использовать SqlParameters, как показано в следующем примере:

// 1. declare command object with parameter
  SqlCommand cmd = new SqlCommand(
      "select * from Customers where city = @City", conn);

Использование параметризованных команд sql поможет предотвратить внедрение SQLатаки.Хорошей практикой также будет фильтрация и проверка вашего пользовательского ввода, поскольку вы используете его в своей команде обновления sql.

Ссылки

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