#asp.net-mvc-4
#asp.net-mvc-4
Вопрос:
Я совершенно новичок в .net, я попытался перейти по следующей ссылке
https://www.youtube.com/watch?v=WLD6DvLI35Yamp;list=PLx7nFxMa-ZcIz2VBKC8FyMjQNmlIvrAi9
но, как и во втором видео, не добавляя данные в базу данных. Я не могу найти ошибку. Я использую VS Express 2012, ASP.NET MVC4 и SQL Server 2014.
Вот мой код:
Index.cshtml
@model MyApp.Models.StudentModel
@{
ViewBag.Title = "Index";
}
<h2>Hi @ViewBag.message</h2>
@using (Html.BeginForm("SaveDataStudent", "Student", new { @id = "Form" }, FormMethod.Post))
{
@Html.ValidationSummary();
@Html.AntiForgeryToken();`
@Html.LabelFor(m=>m.productname)
@Html.TextAreaFor(m=>m.productname)
@Html.ValidationMessageFor(m => m.productname)
@Html.LabelFor(m=>m.quantity)
@Html.TextAreaFor(m=>m.quantity)
@Html.ValidationMessageFor(m => m.quantity)
@Html.LabelFor(m=>m.price)
@Html.TextAreaFor(m=>m.price)
@Html.ValidationMessageFor(m => m.price)
<input type="submit" value ="Save" name ="Save" />
}
@section Scripts{
@Scripts.Render("~/bundles/jqueryval")
}
StudentCotroller
using MyApp.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace MyApp.Controllers
{
public class StudentController : Controller
{
// GET: /Student/
protected CodeDB d = new CodeDB();
public ActionResult Index()
{
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult SaveDataStudent(StudentModel f)
{
if (ModelState.IsValid)
{
d.Open();
int i = d.DataInsert("INSERT INTO tblproduct(productname,price,quantity)VALUES('" f.productname "','" f.price "','" f.quantity "')");
//here getting i=0
if (i > 0)
{
ModelState.AddModelError("Success", "Save Success");
}
else
{
ModelState.AddModelError("Error", "Save Error");
}
d.Close();
}
else
{
var errors = ModelState.Values.SelectMany(v => v.Errors);
}
return View("Index");
}
}
}
CodeDB.cs
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using System.Web.Configuration;`
namespace MyApp.Models
{
public class CodeDB
{
protected SqlConnection con;`
public bool Open(string Connection = "DefaultConnection")
{
con = new SqlConnection(@WebConfigurationManager.ConnectionStrings[Connection].ToString());
try
{
bool b = true;
if (con.State.ToString() != "Open")
{
con.Open();
}
return b;
}
catch (SqlException ex)
{
return false;
}
}
//end Open Connection
//close connection
public bool Close()
{
try
{
con.Close();
return true;
}
catch (Exception ex)
{
return false;
}
}
public int ToInt(Object s)
{
try
{
return Int32.Parse(s.ToString());
}
catch
{
return 0;
}
}
//Insert Data
public int DataInsert(String sql)
{
int lastID = 0;
String query = sql ";SELECT@@Identity;";
try
{
if (con.State.ToString() == "Open")
{
SqlCommand cmd = new SqlCommand(query, con);
cmd.ExecuteNonQuery();
lastID = this.ToInt(cmd.ExecuteScalar());
}
return this.ToInt(lastID);
}
catch
{
return 0;
}
}
}
}
}
Student.cs
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;`
namespace MyApp.Models
{
public class StudentModel
{
[StringLength(5)]
[Required]
[Display(Name = "Name:")]
public string productname { get; set; }`
[StringLength(3,MinimumLength=2,ErrorMessage="Min 5 max 10")]
[Required]
[Display(Name = "Quantitys:")]
public string quantity { get; set; }
[Required(ErrorMessage = "Please enter price.")]
public string price { get; set; }
}
}
Web.config
<connectionStrings>
<add name="DefaultConnection"
connectionString="Data Source=DESKTOP-VC6FUTVSQLEXPRESS;Initial Catalog=MVC4;Persist Security Info=True;User ID=sa;Password=root"
providerName="System.Data.SqlClient" />
</connectionStrings>
В чем моя ошибка?
Ответ №1:
Я не тестировал это, но я думаю, что вам нужен пробел между SELECT и @@Identity здесь: String query = sql ";SELECT@@Identity;";
Я думаю, вы получаете 0 из блока catch внутри метода DataInsert.
Кроме того, вы выполняете запрос дважды; удалите cmd.ExecuteNonQuery();
.
В качестве дополнительного замечания, возможно, вам захочется пересмотреть способ добавления ошибок в ModelState. Я бы удалил имя свойства из этого оператора ModelState.AddModelError("Error", "Save Error");
, поскольку «Ошибка» не является свойством вашей модели (так что сделайте это ModelState.AddModelError(string.Empty, "Save Error");
). Вам понадобится сводка проверки в вашем представлении для отображения ошибок, не связанных с свойствами (например, «Ошибка сохранения»).