PDA

View Full Version : سوال: ذخیره شدن در چند جدول با استفاده از یک view



minaforotan
یک شنبه 17 فروردین 1393, 12:52 عصر
سلام دوستان
یک ویو میخوام طراحی کنم که فیلدهای لازمش و از چند تا جدول مختلف میگیره و با زدن ثبت تو همون چند تا جدول ثبت میشه باید چی کار کنم؟
برای نمایش دادن که از ویومدل ها استفاده میشه اما اینجا رو نمیدونم لطفا اگه کسی میدونه کمک کنه

Dr.Bronx
یک شنبه 17 فروردین 1393, 13:14 عصر
خوب توی کنترلر مربوط به اون صفحه همون ویومدل رو بگیرید .
اونجا اطلاعات مربوط به فیلد های اون صفحه موجود هست دیگه .
حالا به صورت دستی اونها رو توی جدول های مختلف پخش کنید .

موفق باشید ./

sanay_esh
یک شنبه 17 فروردین 1393, 15:31 عصر
با سلام

شما میتوانید یک کلاس ViewModel که شامل تمامی فیلدهای مختلف از جداول مورد نظرتان هست را درست کنید و آن را به View خود بایند نمائید.

از طرفی وقتی میخواهید در هنگام POST شدن ویو این فیلدها را براساس Annotation مدل ساخته شده سفارشی خود اعتبار سنجی نمائید و پس از آن به مدلهای مورد نظر خود اختصاص دهید .

الان شما یک مدل گرفتید بهمراه داده های داخل آن ، حال میتوانید داده های آن را به هر مدلی که میخواهید انتقال داده و در بانک اطلاعاتی درج نمائید.

minaforotan
یک شنبه 17 فروردین 1393, 16:22 عصر
ممنون اما واقعا نمیدونم باید چی کار کنم من از ویومدل همیشه برای نمایش استفاده کردم
الان میخوام تو ویو مورد نظرم تو Newss , Managers اطلاعات اضافه شه
ویو مدل ام به این صورته



public class ListManagers
{
public Manager Managers { get; set; }
public News Newss { get; set; }
}



در ویو هم نوع مدلم و گفتم


@model Proje.ListManagers

حالا تو کنترلر مشکل دارم این قسمت و اگه کمکم کنید ممنون میشم

minaforotan
دوشنبه 18 فروردین 1393, 00:52 صبح
دوستان تو رو خدا اخه این همه مهندس اینجاس اونوقت هیشکی به من اهمیت نمیده خب چی کار کنم بلد نیستم
همه مطالب سایت nettips هم خوندم و فیلمای سایت learnfile هم گرفتم اما هیشکدوم اون مثالی که من میخوام و نداره

kavayo
دوشنبه 18 فروردین 1393, 14:15 عصر
شما میتوانید یک مدل میانه تعریف کنید و سپس در این مدل میانه مدل های دیگر را نیز تعریف کنید و تمامی فیلد های مربوط به جداولتان که قرار است نمایش داده و سپس تغییرات را در آن اعمال کنید در این مدل ها تعریف کنید و سپس برای بالا امدن ویوی مورد نظرتان یک اکشن تعریف کنید که با دسترسی به مدل میانه به مدل های دیگر دسترسی داشته باشد و با دسترسی به جداول مورد نظرتان این فیلد های تعریف شده در مدل ها را مقدار دهی کنید و سپس در این اکشن مدل میانه مقدار دهی شده را به ویو بفرستید واین از قسمت نمایش .و برای ثبت تغییرات بایستی یک اکشن را فراخوانی کنید در این اکشن فیلدهای مربوط به مدل میانه و فیلدهای مربوط به دیگر مدل های تعریف شده در این ویو مدل که مقدار دهی شده اند را بگیرید و در فیلدهای جداولتان بریزید .

minaforotan
دوشنبه 18 فروردین 1393, 15:33 عصر
اره اما نمیدونم چه جوری این کارا رو کنم چه جوری به یه مدل دسترسی پیدا کنم چه جوری بش بگم این مدل فقط برای عمل create است و تو فقط باید کنترلارو داشته باشی و خود مقادیر و نه و . . . با کد نویسی بلد نیستم اگه میشه یه نمونه کد برای یک اکشن که کارش اینه که یه ویو مدل و به یه صفحه create پاس بده بگین

Mojtaba.Shateri
دوشنبه 18 فروردین 1393, 15:55 عصر
اره اما نمیدونم چه جوری این کارا رو کنم چه جوری به یه مدل دسترسی پیدا کنم چه جوری بش بگم این مدل فقط برای عمل create است و تو فقط باید کنترلارو داشته باشی و خود مقادیر و نه و . . . با کد نویسی بلد نیستم اگه میشه یه نمونه کد برای یک اکشن که کارش اینه که یه ویو مدل و به یه صفحه create پاس بده بگین

در صورت صلاحدید فایل View و Controller و کلاسای Viewmodel بفرس براتون تکمیل کنم بفرستم.

minaforotan
دوشنبه 18 فروردین 1393, 22:47 عصر
ممنون فرستادم MvcApplication1.zip (http://www.uplooder.net/cgi-bin/dl.cgi?key=7511e7bec45f76c1abd63fd49091cfdf)

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

Mojtaba.Shateri
سه شنبه 19 فروردین 1393, 13:40 عصر
ممنون فرستادم MvcApplication1.zip (http://www.uplooder.net/cgi-bin/dl.cgi?key=7511e7bec45f76c1abd63fd49091cfdf)

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

یه فولدر درست کنید به اسم ViewModels و کلاسهای زیر رو جدا جدا در اون بسازید.
public class ManagerViewModel
{
public int Id { get; set; }
public string Name { get; set; }
public string Family { get; set; }
public int Type { get; set; }
}
public class PicViewModel
{
public int Id { get; set; }
public string Address { get; set; }
public string Title { get; set; }
}
public class CreateManagerViewModel
{
public ManagerViewModel ManagerViewModel { get; set; }
public PicViewModel PicViewModel { get; set; }
}
پارامتر cmViewModel یک نمونه از کلاس CreateManagerViewModel هست و حاوی اطلاعاتیست که کاربر وارد کرده. کافی شما اونهارو بریزی توی کلاسهای Manager و Pic . در واقع Map کنی.
متد های اکشن Create شما میشه این :
//
// GET: /Manager/Create

[HttpGet]
public ActionResult Create()
{
return View();
}

//
// POST: /Manager/Create

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(CreateManagerViewModel cmViewModel)
{
if (ModelState.IsValid)
{
//map cmViewModel to Pic and Manager classes.
//save to DB
return RedirectToAction("Index");
}

return View(cmViewModel);
}


حالا در فایل create.cshtml این میشه محتواش :
@model MvcApplication1.ViewModels.CreateManagerViewModel

@{
ViewBag.Title = "Create";
}

<h2>Create</h2>

@using (Html.BeginForm()) {
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)

<fieldset>
<legend>Manager</legend>

<div class="editor-label">
@Html.LabelFor(model => model.ManagerViewModel.Name)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.ManagerViewModel.Name)
@Html.ValidationMessageFor(model => model.ManagerViewModel.Name)
</div>

<div class="editor-label">
@Html.LabelFor(model => model.ManagerViewModel.Family)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.ManagerViewModel.Family)
@Html.ValidationMessageFor(model => model.ManagerViewModel.Family)
</div>

<div class="editor-label">
@Html.LabelFor(model => model.ManagerViewModel.Type)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.ManagerViewModel.Type)
@Html.ValidationMessageFor(model => model.ManagerViewModel.Type)
</div>

<div class="editor-label">
@Html.LabelFor(model => model.PicViewModel.Title)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.PicViewModel.Title)
@Html.ValidationMessageFor(model => model.PicViewModel.Title)
</div>

<p>
<input type="submit" value="Create" />
</p>
</fieldset>
}


یه نکته دیگه اینکه در فولدر App_Start هم در فایل RouteConfig.cs اکشن پیشفرض رو به شکل زیر به Index تغییر بدید. یعنی میشه این :
using System.Web.Mvc;
using System.Web.Routing;

namespace MvcApplication1
{
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Manager", action = "Index", id = UrlParameter.Optional }
);
}
}
}
نکته اینکه اگه میخواید در هنگام ایجاد یک مدیر براش تعداد دلخواه Activity ایجاد کنید بهتره از AJAX و WebApi استفاده کنید.

minaforotan
سه شنبه 19 فروردین 1393, 14:16 عصر
واقعا ممنون دوس عزیز که وقت گذاشتین


نکته اینکه اگه میخواید در هنگام ایجاد یک مدیر براش تعداد دلخواه Activity ایجاد کنید بهتره از AJAX و WebApi استفاده کنید.

میشه یه منبع در این زمینه بم معرفی کنید کجا میتونم در این باره بیشتر بدونم؟

Mojtaba.Shateri
سه شنبه 19 فروردین 1393, 14:21 عصر
http://www.asp.net/web-api
http://www.codeproject.com/Articles/344078/ASP-NET-WebAPI-Getting-Started-with-MVC-and-WebAP
http://www.codeproject.com/Tips/678138/MVC-using-Web-API-and-JQuery-to-GET-or-POST-Data

امیدوارم مفید باشه.

Mojtaba.Shateri
سه شنبه 19 فروردین 1393, 16:03 عصر
واقعا ممنون دوس عزیز که وقت گذاشتین

میشه یه منبع در این زمینه بم معرفی کنید کجا میتونم در این باره بیشتر بدونم؟

تکمیل شده :
این میشه اکشن شما :
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(CreateManagerViewModel cmViewModel)
{
var activitiesViewModel = new List<ActivityViewModel>()
{
//dar inja masalan dar form in list por shode.
};

if (ModelState.IsValid)
{

//map cmViewModel to Pic and Manager classes.
Manager manager = Mapper.ToManager(cmViewModel.ManagerViewModel, cmViewModel.PicViewModel,
activitiesViewModel);
db.Managers.Add(manager);
db.SaveChanges();
return RedirectToAction("Index");
}

return View(cmViewModel);
}
و این کلاس رو به پروژه اضافه می کنید :
public class Mapper
{
public static Manager ToManager(ManagerViewModel mnViewModel,PicViewModel picViewModel,List<ActivityViewModel> activitiesViewModel)
{
Manager manager = new Manager();
manager.ID = mnViewModel.Id;
manager.Name = mnViewModel.Name;
manager.Family = mnViewModel.Family;
manager.Type = mnViewModel.Type;
manager.Activities = new List<Activity>();
manager.Activities = activitiesViewModel.Select(x => ToActivity(x)).ToList();
manager.pic = new Pic();
manager.pic = ToPic(picViewModel);
return manager;
}

public static Activity ToActivity(ActivityViewModel activityViewModel)
{
return new Activity()
{
ID = activityViewModel.Id,
Title = activityViewModel.Title,
Start = activityViewModel.Start,
Position = activityViewModel.Position,
Finish = activityViewModel.Finish,
Length = activityViewModel.Length
};
}

public static Pic ToPic(PicViewModel picViewModel)
{
return new Pic()
{
ID = picViewModel.Id,
Title = picViewModel.Title,
Address = picViewModel.Address
};
}
}
اینجا ما یک Mapper نوشتیم و ازش استفاده می کنیم. البته روشهای مختلفی هست اما برا اینکه خوب یاد بگیرید من ساده و دستی انجام دادم.
در متد Create همونطور که مشاهده می کنید activitiesViewModel قرار داده شده. از اونجایی که شما میخوای هر مدیر چندین فعالیت داشته باشه ، این یعنی باید در یک View مناسبی علاوه بر اطلاعات Manager و Pic لیستی از Activity ها را نیز بگیرید. و چون کاربر دوس داره در صفحه به راحتی Activity اضافه کنه برا همین راحتتره که از Ajax و WebApi استفاده کنید. البته ابزرهای آماده مثل Telerik و Kendo UI هم هستند.

Mojtaba.Shateri
سه شنبه 19 فروردین 1393, 16:05 عصر
واقعا ممنون دوس عزیز که وقت گذاشتین

میشه یه منبع در این زمینه بم معرفی کنید کجا میتونم در این باره بیشتر بدونم؟

تکمیل شده :
این میشه اکشن شما :
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(CreateManagerViewModel cmViewModel)
{
var activitiesViewModel = new List<ActivityViewModel>()
{
//dar inja masalan dar form in list por shode.
};

if (ModelState.IsValid)
{

Manager manager = Mapper.ToManager(cmViewModel.ManagerViewModel, cmViewModel.PicViewModel,
activitiesViewModel);
db.Managers.Add(manager);
db.SaveChanges();
return RedirectToAction("Index");
}

return View(cmViewModel);
}


و این کلاس رو به پروژه اضافه می کنید :
public class Mapper
{
public static Manager ToManager(ManagerViewModel mnViewModel,PicViewModel picViewModel,List<ActivityViewModel> activitiesViewModel)
{
Manager manager = new Manager();
manager.ID = mnViewModel.Id;
manager.Name = mnViewModel.Name;
manager.Family = mnViewModel.Family;
manager.Type = mnViewModel.Type;
manager.Activities = new List<Activity>();
manager.Activities = activitiesViewModel.Select(x => ToActivity(x)).ToList();
manager.pic = new Pic();
manager.pic = ToPic(picViewModel);
return manager;
}

public static Activity ToActivity(ActivityViewModel activityViewModel)
{
return new Activity()
{
ID = activityViewModel.Id,
Title = activityViewModel.Title,
Start = activityViewModel.Start,
Position = activityViewModel.Position,
Finish = activityViewModel.Finish,
Length = activityViewModel.Length
};
}

public static Pic ToPic(PicViewModel picViewModel)
{
return new Pic()
{
ID = picViewModel.Id,
Title = picViewModel.Title,
Address = picViewModel.Address
};
}
}
اینجا ما یک Mapper نوشتیم و ازش استفاده می کنیم. البته روشهای مختلفی هست اما برا اینکه خوب یاد بگیرید من ساده و دستی انجام دادم.
در متد Create همونطور که مشاهده می کنید activitiesViewModel قرار داده شده. از اونجایی که شما میخوای هر مدیر چندین فعالیت داشته باشه ، این یعنی باید در یک View مناسبی علاوه بر اطلاعات Manager و Pic لیستی از Activity ها را نیز بگیرید. و چون کاربر دوس داره در صفحه به راحتی Activity اضافه کنه برا همین راحتتره که از Ajax و WebApi استفاده کنید. البته ابزرهای آماده مثل Telerik و Kendo UI هم هستند.

minaforotan
سه شنبه 19 فروردین 1393, 17:35 عصر
فقط اطلاعات مربوط به مدیر درج میشه و فعالیت ها و تصویر درج نمیشن

minaforotan
چهارشنبه 20 فروردین 1393, 00:56 صبح
دوست عزیز تا اینجاش همراهی کردین فقط یه تیکه شو گفتین خودم بنویسم که فک کنم خراب کردم که جواب نمیده همه چی درسته واطلاعات تو جدول تصاویرم هم ذخیره میشه فقط فعالیت ها دخیره نمیشه فک کنم بلد نیستم لیست و پر کنم

minaforotan
یک شنبه 31 فروردین 1393, 12:47 عصر
118187
دوست عزیز تا این جا به لطف شما کارم خیلی راه افتاده
شما گفتین که باید لیست و هم پر کنم
تو کنترلر مربوطه به این صورت نوشتم



public ActionResult Create(CreateManagerVM cmViewModel, string[] result)

var Activity = new List<Activity>()
{
new Activity
{ Title = "name2" },
new Activity
{ Title = "name3" }

};

if (ModelState.IsValid)
{
Manager manager = Mapper.ToManager(cmViewModel.Manager, cmViewModel.pic, Activity, Specialty);

db.Managers.Add(manager);

db.SaveChanges();

return RedirectToAction("Index");
}

return View(cmViewModel);
}


همان طور که میبینید لیستو دستی مقدار دادم و خب همه چی هم درسته اما من میخوام وقتی مثلا رو فعالیت بعدی میزنم این مقدارهام تو لیستم ذخیره شه باور کنید خیلی تلاش کردم اما نتونستم درستش کنم

minaforotan
دوشنبه 01 اردیبهشت 1393, 14:26 عصر
اخه این همه استاد اینجا چرا کسی کمکم نمیکنه:ناراحت::ناراحت::نارا ت::ناراحت::ناراحت::ناراحت::ن راحت: