Как добавить ценность существующему объекту в ASP.NET

#asp.net #asp.net-mvc

Вопрос:

У меня возникает проблема с добавлением ценности к существующему объекту в asp.net, Я пытаюсь найти пример, но всегда терплю неудачу, когда публикую данные из формы ввода, просто имя и город, но в контроллере я хочу добавить адресные данные (статические данные), пожалуйста, помогите мне решить эту проблему.

Создать.cshtml :

 @model CRUDinMVC.Models.StudentModel   @using (Html.BeginForm())  {  @Html.AntiForgeryToken()   lt;div class="form-horizontal"gt;  lt;h4gt;gt;@ViewBag.ItemListlt;/h4gt;  lt;hr /gt;  @Html.ValidationSummary(true, "", new { @class = "text-danger" })  lt;div class="form-group"gt;  @Html.LabelFor(model =gt; model.Name, htmlAttributes: new { @class = "control-label col-md-2" })  lt;div class="col-md-10"gt;  @Html.EditorFor(model =gt; model.Name, new { htmlAttributes = new { @class = "form-control" } })  @Html.ValidationMessageFor(model =gt; model.Name, "", new { @class = "text-danger" })  lt;/divgt;  lt;/divgt;   lt;div class="form-group"gt;  @Html.LabelFor(model =gt; model.City, htmlAttributes: new { @class = "control-label col-md-2" })  lt;div class="col-md-10"gt;  @Html.EditorFor(model =gt; model.City, new { htmlAttributes = new { @class = "form-control" } })  @Html.ValidationMessageFor(model =gt; model.City, "", new { @class = "text-danger" })  lt;/divgt;  lt;/divgt;    lt;div class="form-group"gt;  lt;div class="col-md-offset-2 col-md-10"gt;  lt;input type="submit" value="Create" class="btn btn-default" /gt;  lt;/divgt;  lt;/divgt; lt;/divgt; }  lt;divgt;  @Html.ActionLink("Back to List", "Index") lt;/divgt;  lt;script src="~/Scripts/jquery-3.4.1.min.js"gt;lt;/scriptgt; lt;script src="~/Scripts/jquery.validate.min.js"gt;lt;/scriptgt; lt;script src="~/Scripts/jquery.validate.unobtrusive.min.js"gt;lt;/scriptgt;  

StudentModel.cs :

 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.ComponentModel.DataAnnotations;  namespace CRUDinMVC.Models {  public class StudentModel  {  [Display(Name = "Id")]  public int Id { get; set; }   [Required(ErrorMessage = "First name is required.")]  public string Name { get; set; }   [Required(ErrorMessage = "City is required.")]  public string City { get; set; }  } }  

StudentDBHandle.cs

 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Data; using System.Data.SqlClient; using System.Configuration;  namespace CRUDinMVC.Models { public class StudentDBHandle  { private SqlConnection con;  private void connection()  {  string constring = ConfigurationManager.ConnectionStrings["studentconn"].ToString();  con = new SqlConnection(constring);  }   // **************** ADD NEW STUDENT *********************  public bool AddStudent(StudentModel smodel)  {  connection();  SqlCommand cmd = new SqlCommand("AddNewStudent", con);  cmd.CommandType = CommandType.StoredProcedure;   cmd.Parameters.AddWithValue("@Name", smodel.Name);  cmd.Parameters.AddWithValue("@City", smodel.City);  cmd.Parameters.AddWithValue("@Address", smodel.Address);   con.Open();  int i = cmd.ExecuteNonQuery();  con.Close();   if (i gt;= 1)  return true;  else  return false;  } } }  

StudentController.cs : (in this controller I wanna add address value before pass to StudentDBHandle.cs)

 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.IO; using System.Web.Mvc; using CRUDinMVC.Models; using System.Diagnostics;  namespace CRUDinMVC.Controllers {  public class StudentController : Controller  {  // 1. *************RETRIEVE ALL STUDENT DETAILS ******************  // GET: Student  public ActionResult Index()  {  StudentDBHandle dbhandle = new StudentDBHandle();  ModelState.Clear();  return View(dbhandle.GetStudent());  }   // 2. *************ADD NEW STUDENT ******************  // GET: Student/Create  public ActionResult Create()  {  return View();  }   // POST: Student/Create  [HttpPost]  public ActionResult Create(StudentModel smodel) **// in this function I wanna add Address value, How to do it ?**  {  try  {  if (ModelState.IsValid)  {  StudentDBHandle sdb = new StudentDBHandle();   if (sdb.AddStudent(smodel))  {  ViewBag.Message = "Student Details Added Successfully";  ModelState.Clear();  }  }  return RedirectToAction("Index");  }  catch  {  return View();  }  }  } }  

Пожалуйста, помогите мне и спасибо вам.

Ответ №1:

Я бы использовал модель представления. Это другой класс, который позволяет сопоставлять свойства без прямого доступа к объектам данных.

 public class StudentViewmodel {  [Display(Name = "Id")]  public int Id { get; set; }   [Required(ErrorMessage = "First name is required.")]  public string Name { get; set; }   [Required(ErrorMessage = "City is required.")]  public string City { get; set; }   public string Address { get; set; } }  

Теперь вместо использования StudentModel в вашем представлении используйте StudentViewmodel , которое предоставляет свойство адреса, в которое вы можете добавить информацию о своем адресе:

 // POST: Student/Create [HttpPost] public ActionResult Create(StudentViewmodel smodel) {  try  {  if (ModelState.IsValid)  {  smodel.Address = "you put your address information here.";  StudentDBHandle sdb = new StudentDBHandle();  if (sdb.AddStudent(smodel))  {  ViewBag.Message = "Student Details Added Successfully";  ModelState.Clear();  }  }  return RedirectToAction("Index");  }  catch  {  return View();  } }  

Не забудьте также изменить тип параметра в StudentDBHandle , чтобы он также использовал объект StudentViewModel.

Вам даже не нужно выполнять дополнительное сопоставление, так как модель представления содержит те же имена свойств, что и ваша модель данных.

 public bool AddStudent(StudentViewmodel smodel) {  connection();  SqlCommand cmd = new SqlCommand("AddNewStudent", con);  cmd.CommandType = CommandType.StoredProcedure;   cmd.Parameters.AddWithValue("@Name", smodel.Name);  cmd.Parameters.AddWithValue("@City", smodel.City);  cmd.Parameters.AddWithValue("@Address", smodel.Address);   con.Open();  int i = cmd.ExecuteNonQuery();  con.Close();   // You can simplify your return, too.  return i gt;= 1;  //if (i gt;= 1)  // return true;  //else  // return false; }  

Комментарии:

1. О, потрясающе, Спасибо @Ortund

2. Всегда рад помочь. Не забудьте отметить ответ как принятый, если вы счастливы, что он решил проблему!