#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. Всегда рад помочь. Не забудьте отметить ответ как принятый, если вы счастливы, что он решил проблему!