PDA

View Full Version : سوال: اکشن حذف



manit44
شنبه 08 تیر 1392, 22:36 عصر
سورس اکشن حذف در mvc4 رو میخواستم لطفا کمکم کنید

ali_autumnal
شنبه 08 تیر 1392, 23:34 عصر
به شکل ساده:


public ActionResult Delete(int id)
{
if (ModelState.IsValid)
{
var item = context.SliderModels.Find(id);
context.SliderModels.Remove(item);
context.SaveChanges();
}
return RedirectToAction("Index");
}

manit44
یک شنبه 09 تیر 1392, 00:07 صبح
context چیه؟ form collection را نیز بنویسید.

ali_autumnal
یک شنبه 09 تیر 1392, 09:20 صبح
context شئی از dbContext شما هست

formCollection هم به همین صورت هست. فقط با نام کلید بایستی بخونید

در هنگام حذف و ویرایش اطلاعات برای سادگی و خوانا بودن کد بهتره کلید اصلی رو به کنترلر ارسال کنید و عملیات رو انجام بدید.

mze666
یک شنبه 09 تیر 1392, 09:24 صبح
البته در Action مربوط به Delete نیازی به چک کردن ModelState.IsValid نیست.

hakan648
یک شنبه 09 تیر 1392, 12:52 عصر
سلام
هم باید چک بشه که آیتم وجود داشته باشه و هم نوع درخواست باید محدود به HttpPost باشه. (در این مقاله (http://www.dotnettips.info/post/813)، قسمت "یک نکته امنیتی" را مطالعه بفرمایید.)

Wily_Fox
یک شنبه 09 تیر 1392, 14:06 عصر
نکته [HttpPost] جالب بود.

متشکرم

manit44
دوشنبه 10 تیر 1392, 15:25 عصر
هر کاری میکنم sliderModel رو نمیاره

ali_autumnal
دوشنبه 10 تیر 1392, 15:58 عصر
هر کاری میکنم sliderModel رو نمیاره

دوست عزیز sliderModel یه مثال بود. بجای slidermodel اسم جدول هایی موجود در dbcontext خودتون رو قرار بدید

manit44
دوشنبه 10 تیر 1392, 19:16 عصر
بعد از اینکه اسم جدول خودم را میزنم متد find() و remove را نمیاره

ali_autumnal
دوشنبه 10 تیر 1392, 23:26 عصر
کدهایی که نوشته اید رو بزارید.

dbcontext رو هم بزارید

manit44
سه شنبه 11 تیر 1392, 01:09 صبح
این تا اینجاش public ActionResult Delete(int? id)
{
var q = db.tbl_students.Where(c => c.id == id).SingleOrDefault();
return View(q);
}
public ActionResult remove(FormCollection form3)
{
if (ModelState.IsValid)
{
var item =db.tbl_students

ali_autumnal
سه شنبه 11 تیر 1392, 10:21 صبح
کلاس dbcontext رو هم قرار بدید

manit44
سه شنبه 11 تیر 1392, 13:30 عصر
اگه میتونید اکشن حذف را کدشو برام بذارید

ali_autumnal
سه شنبه 11 تیر 1392, 16:08 عصر
در post شماره 2 که نوشته شده

manit44
چهارشنبه 12 تیر 1392, 00:12 صبح
کلاس dbcontext رو کجا باید قرار بدم لطفا منظورتون را واضح تر بگید

ali_autumnal
چهارشنبه 12 تیر 1392, 10:21 صبح
کلاس MyDbContext مشتق شده از کلاس DbContext غالبا در پوشه ای بنام DataLayer قرار می دهند.

این کلاس در ایجاد و ارتباط با دیتبیس نقش اصلی رو ایفا می کنه.

اطلاعات بیشتر در لینک (http://www.dotnettips.info/post/831/ef-code-first-1) این لینک و ادامه این لینک رو تا آخر Entity framwork بخونید

و جهت یادگیری بهتر MVC هم این لینک (http://www.dotnettips.info/post/803/asp-net-mvc-1)رو تا آخرین لینک بخونید

manit44
چهارشنبه 12 تیر 1392, 10:45 صبح
امکانش هست کدی که نوشتم رو ویرایش کنید و درستش رو بنویسید؟ ممنون میشم

ali_autumnal
چهارشنبه 12 تیر 1392, 13:56 عصر
متدهای Remove و Find متدهای کلاس DbSet هستند. وقتی مدل شما از نوع DbSet تعریف میشه خودبه خود این متدها رو ارث بری میکنه



public DbSet<UserProfile> UserProfiles { set; get; }

manit44
چهارشنبه 12 تیر 1392, 14:20 عصر
کلاس DbSet در چه فضای نامی تعریف میشه؟

ali_autumnal
چهارشنبه 12 تیر 1392, 14:22 عصر
System.Data.Entity

manit44
چهارشنبه 12 تیر 1392, 14:30 عصر
این فضای نام هم تعریف کردم اما کلاس dbSet را نیاورد

ali_autumnal
چهارشنبه 12 تیر 1392, 18:33 عصر
یعنی شما همچین چیزی می نویسید خطا میده!؟


public DbSet<UserProfile> UserProfiles { set; get; }

manit44
چهارشنبه 12 تیر 1392, 21:44 عصر
بله دقیقا همینطوره

ali_autumnal
پنج شنبه 13 تیر 1392, 00:12 صبح
هنگام ایجاد پروژه کدام یک از گزینه های ایجاد پروژه رو انتخاب کردید؟

مطمئن هستید Entity framwork رو نصب کردید؟

manit44
پنج شنبه 13 تیر 1392, 11:13 صبح
این مسیر رو میرم: file> new> project> web> asp.net mvc4 web application

ali_autumnal
پنج شنبه 13 تیر 1392, 11:44 صبح
این لینک (http://barnamenevis.org/showthread.php?400954-%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF-%D9%BE%D8%B1%D9%88%DA%98%D9%87-%D8%AC%D8%AF%DB%8C%D8%AF) رو ببینید

manit44
پنج شنبه 13 تیر 1392, 14:57 عصر
الان درست شد ولی موقع کامپایل با این ارور مواجه میشم: The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ActionResult remove(Int32, System.Web.Mvc.FormCollection)' in 'university_mvc.Controllers.universityController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.
Parameter name: parameters

mze666
پنج شنبه 13 تیر 1392, 16:52 عصر
دوست عزیز به نظرم شما باید یه دور ASP.NET MVC رو از اول و با دقت بیشتر بخونید + Entity Framework

manit44
پنج شنبه 13 تیر 1392, 18:35 عصر
این کل کد سورس اکشن حذفی هست که نوشتم لطفا اشکالاتش را بگویید: در ضمن st شیئی از کلاس جدولم هست و student شیئی از کلاس DbSet هست و context هم نیز شیئی از کلاس DbContext هست.

public ActionResult Delete(int id=0)
{
tbl_student st = student.Find(id);
if (st == null)
{
return HttpNotFound();
}
return View(st);
}


public ActionResult remove(int id=0)
{
tbl_student st = student.Find(id);
if (st == null)
{
return HttpNotFound();
}
student.Remove(st);
context.SaveChanges();
return RedirectToAction("index");
}
}
}

mze666
پنج شنبه 13 تیر 1392, 19:57 عصر
یا اسم remove رو بکنید Delete و بالاش فقط [HttpPost] بذارید یا اینکه اگر می خواهید همین اسم (remove) باشه بالاش علاوه بر [HttpPost] این رو هم باید بذارید: [ActionName("Delete")]
قطعه کد کامل:

[HttpGet]
public ActionResult Delete(int id=0)
{
var st = context.Students.Find(id);
if (st == null)
{
return HttpNotFound();
}
return View(st);
}

[ActionName("Delete")]
[HttpPost]
public ActionResult remove(int id)
{
var st = context.Students.Find(id);
if (st == null)
{
return HttpNotFound();
}
context.Students.Remove(st);
context.SaveChanges();
return RedirectToAction("index");
}

manit44
پنج شنبه 13 تیر 1392, 20:22 عصر
الان به این قسمت tbl_student st = student.Find(id); ارور می گیره و میگه: Object reference not set to an instance of an object.

mze666
پنج شنبه 13 تیر 1392, 20:25 عصر
اوه اوه حواسم نبود. باید بنویسید context.Students.Remove(st) و برای گرفتنش هم همینطور context.Students.Find(id)
الان توی کد بالا هم درستش می کنم.

manit44
پنج شنبه 13 تیر 1392, 20:31 عصر
میبخشید مگه DbContext نباید به صورت public dbcontext; تعریف بشه؟

mze666
پنج شنبه 13 تیر 1392, 20:39 عصر
اول کلاس کنترلر مربوطه به صورت زیر تعریف میشه:
private MyContext context = new MyContext();
که میتونید توی using هم بنویسید مثل کد زیر:
using (var context = new MyContext())
{
// ارتباط با ديتابيس
}

manit44
پنج شنبه 13 تیر 1392, 20:46 عصر
MyContext اسم جدولمون هست دیگه؟

mze666
پنج شنبه 13 تیر 1392, 20:49 عصر
نه دیگه! MyContext اسم کلاسی هست که از DbContext مشتق شده. شما از Entity Framwork Code First استفاده کردید یا Database First (فایل edmx)؟

manit44
پنج شنبه 13 تیر 1392, 20:54 عصر
من از DbSet استفاده کردم و همچنین با linq برنامه ام رو دارم می نویسم

mze666
پنج شنبه 13 تیر 1392, 21:03 عصر
یعنی چی از DbSet استفاده می کنید؟ DbSet رو کجا تعریف کردید؟ اصلاً context که توی کدهاتون نوشته بودید چی بود؟!
به هر حال اگر از Entity Framework استفاده نمی کنید من هم نمی تونم کمکتون کنم.
شرمنده.

manit44
پنج شنبه 13 تیر 1392, 21:09 عصر
اولا: dbSet رو در کلاس کنترلر تعریف کردم

ثانیا:من اومدم یک dbContext هم تعریف کردم

ثالثا از Entity FrameWork استفاده میکنم چون فضای نام System.Data.Entity رو تعریف کردم.

mze666
پنج شنبه 13 تیر 1392, 21:13 عصر
خوب اشتباه کردید دیگه! DbSet باید توی کلاس DbContext ای که درست کردید تعریف بشه.
public class MyContext : DbContext
{
public DbSet<Student> Students { set; get; }
}

manit44
پنج شنبه 13 تیر 1392, 23:29 عصر
اکشن delete رو درست کردم ولی تو اکشن create هر رکوردی که اضافه میکنم به دیتابیسم اضافه نمیشه باید چکار کنم؟

mze666
جمعه 14 تیر 1392, 10:24 صبح
برید Entity Framework رو درست بخونید مشکلتون حل میشه. چند روزه توی Delete گیر کردید، الان توی Create گیر کردید، فردا توی Edit، پس فردا توی Details و ...