PDA

View Full Version : اپدیت چند جدول با استفاده از ویو مدل



leilast
سه شنبه 28 آذر 1396, 13:17 عصر
سلام.
من برای آپدبت اطلاعات چند جدول از ویو مدل زیر استفاده کردم:

public class UserManagementViewModel
{
public EmployeePosition EmployeePositions { get; set; }
public Employee Employees { get; set; }
public UsersInfo UserInfos { get; set; }
public Department Departments { get; set; }
}


اولین قدم نمایش اطلاعات بر اساس ای دی انتخاب شده توسط متدget هست.
نمایش اطلاعات درست انجام میشه. (از join استفاده کردم)
کد کنترلر برای متد get

[HttpGet]
public ActionResult UpdateUsers(int id)
{
var db = new ParsDataEntities();
var ViewModel = (from EP in db.EmployeePositions
join Dep in db.Departments on EP.DepID equals Dep.DepID
join E in db.Employees on EP.EmpID equals E.EmpID
join UI in db.UsersInfos on EP.EmpID equals UI.Usr_EmpID
where EP.DepID == Dep.DepID && EP.EmpID == E.EmpID && EP.EmpID == UI.Usr_EmpID
select new UserManagementViewModel
{
EmployeePositions = EP,
Departments = Dep,
Employees = E,
UserInfos = UI,
}).AsEnumerable();


var user = ViewModel.FirstOrDefault(p => p.Employees.EmpID == id);
return View(user);
}


بعد از اون متدpost باید اطلاعاتی که ویرایش میشه رو اپدیت کنه.
اما این متد با مشکل مواجه هست.
بعد از سابمیت فرم بریک پوینت اصلا وارد متد post نمیشه و هیچ خطایی هم نمیده(ادرس دهی هم درسته)
فکر میکنم ارتباط بین get و post درست انجام نمیشه.
این کد کنترلر هست:
(کد بنظر طولانی میاد اما بیشترش انتساب مقادیر جدید هست و چیز پیچیده ای نداره)

[HttpPost]
[AjaxOnly]
public ActionResult UpdateUsers(UserManagementViewModel model)
{
var db = new ParsDataEntities();
if (ModelState.IsValid)
{
try
{


var ExistingEmployee = db.Employees.FirstOrDefault(s => s.EmpID == model.Employees.EmpID);
//ExistingEmployee.EmpID = user.Employees.EmpID;
ExistingEmployee.EmpPCode = model.Employees.EmpPCode;
ExistingEmployee.EmpFirstName = model.Employees.EmpFirstName;
ExistingEmployee.EmpLastName = model.Employees.EmpLastName;
ExistingEmployee.EmpNationalID = model.Employees.EmpNationalID;
ExistingEmployee.EmpEmail = model.Employees.EmpEmail;
ExistingEmployee.EmpAddress = model.Employees.EmpAddress;
ExistingEmployee.EmpMobile = model.Employees.EmpMobile;
ExistingEmployee.EmpPhone = model.Employees.EmpPhone;
db.Entry(VM.Employees).State = System.Data.Entity.EntityState.Modified;
db.SaveChanges();
var ExistingEmployeePosition = db.EmployeePositions.FirstOrDefault(s => s.EmpID == model.Employees.EmpID);
//EmpID = model.EmployeePositions.EmpID,
ExistingEmployeePosition.EmpID = model.Employees.EmpID;
ExistingEmployeePosition.EmpPosID = model.EmployeePositions.EmpPosID;
ExistingEmployeePosition.DepID = model.EmployeePositions.DepID;
db.Entry(VM.EmployeePositions).State = System.Data.Entity.EntityState.Modified;
//EmpID_Creator=model.EmployeePositions.EmpID_Creato r
db.SaveChanges();
var ExistingUserInfo = db.UsersInfos.FirstOrDefault(s => s.Usr_EmpID == model.Employees.EmpID);
//Usr_EmpID = model.UserInfos.Usr_EmpID,
ExistingUserInfo.Usr_EmpID = model.Employees.EmpID;
ExistingUserInfo.Usr_UserName = model.UserInfos.Usr_UserName;
ExistingUserInfo.Usr_Password = model.UserInfos.Usr_Password;
ExistingUserInfo.Usr_Activation = model.UserInfos.Usr_Activation;
//Usr_CreateDate = DateTime.UtcNow
//Usr_FailedLoginCount = model.UserInfos.Usr_FailedLoginCount,
//Usr_LastLoginDate = model.UserInfos.Usr_LastLoginDate,
ExistingUserInfo.Usr_LastPassChanged = DateTime.UtcNow;
db.Entry(VM.UserInfos).State = System.Data.Entity.EntityState.Modified;
db.SaveChanges();
}
catch (DbEntityValidationException e)
{
foreach (var eve in e.EntityValidationErrors)
{
Console.WriteLine("Entity of type "{0}" in state "{1}" has the following validation errors:",
eve.Entry.Entity.GetType().Name, eve.Entry.State);
foreach (var ve in eve.ValidationErrors)
{
Console.WriteLine("- Property: "{0}", Error: "{1}"",
ve.PropertyName, ve.ErrorMessage);
}
}
throw;
}


return MessageBox.Show("ویرایش انجام شد", MessageType.Success);
}
else
{
return MessageBox.Show(ModelState.GetErrors(), MessageType.Error);
}


}


اگر ممکنه بررسی بفرمایید که مشکل از کجاست؟
مدلی هم که به ویو ارسال میکنم همون ویومدل اول هست.

mr.sirwan
سه شنبه 28 آذر 1396, 14:23 عصر
لطفا کد ویو رو هم قرار بدین، بعدش بفرمایین که ایا از اتریبیوت Authorize در سطح کنترلر استفاده کردین یا خیر؟
و بازم آیا از unobtrasive در layout یا در ویو استفاده کردین یا خیر؟

leilast
سه شنبه 28 آذر 1396, 17:28 عصر
از Authorize استفاده نکردم.
از unobtrasive استفاده کردم. اما در layout نگذاشتم، در همین صفحه گذاشتم.
کد ویو :

@model BPMSPars.ViewModels.Admin.UserManagementViewModel
@{
ViewBag.Title = "UpdateUsers";
Layout = "~/Views/Shared/_SettingLayout.cshtml";
}

@using (Html.BeginForm("UpdateUsers", "Admin", FormMethod.Post, new { id = "UpdateForm" }))
{
<div class="form-group">
<label>نام</label>
@Html.TextBoxFor(model => model.Employees.EmpFirstName, new { @class = "form-control1", placeholder = "نام کاربری" })
</div>
<div class="form-group">
<label>نام خانوادگی</label>
@Html.TextBoxFor(model => model.Employees.EmpLastName, new { @class = "form-control1", placeholder = "نام خانوادگی" })
</div>
@*@using BPMSPars.Models.Enums
<div class="form-group">
@{
var genderList = Enum.GetValues(typeof(gender)).OfType<gender>().Select(p => new { Text = p.ToString(), Value = (int)p }).ToList();
}
<label>جنسیت</label>
@Html.DropDownListFor(model => model.Employees.EmpSex, new SelectList(genderList, "Value", "Text"), new { @class = "form-control1 select2 ", style = "width:100 %;" })
</div>*@
<div class="form-group">
<label>شماره پرسنلی</label>
@Html.TextBoxFor(model => model.Employees.EmpPCode, new { @class = "form-control1", placeholder = "کد پرسنلی" })
</div>
</div>
<div class="col-lg-3 col-md-3 col-sm-4 col-xs-6">
<div class="form-group">
<label>تلفن</label>
@Html.TextBoxFor(model => model.Employees.EmpPhone, new { @class = "form-control1", placeholder = "تلفن" })
</div>
<div class="form-group">
<label>تلفن همراه</label>
@Html.TextBoxFor(model => model.Employees.EmpMobile, new { @class = "form-control1", placeholder = "تلفن همراه" })
</div>
<div class="form-group">
<label>آدرس ایمیل</label>
@Html.TextBoxFor(model => model.Employees.EmpEmail, new { @class = "form-control1", placeholder = "ایمیل" })
</div>
<div class="form-group">
<label>شماره ملی</label>
@Html.TextBoxFor(model => model.Employees.EmpNationalID, new { @class = "form-control1", placeholder = "شماره ملی" })
</div>
</div>
<div class="form-group">
<label>آدرس</label>
@Html.TextBoxFor(model => model.Employees.EmpAddress, new { @class = "txtarea ", placeholder = "آدرس", rows = 4 })
</div></div>
<div class="row">
<div class="form-group">
<label>
@Html.CheckBoxFor(model => model.UserInfos.Usr_Activation)
کاربر فعال است
</label>
</div>
<div class="box ">
<div class="box-header with-border">
<h5 class="box-title"></h5>
اطلاعات کاربری
</div>
@using BPMSPars.Models.Enums
<div class="form-group">
<label>سمت سازمانی</label>
@{
var positionList = Enum.GetValues(typeof(Position)).OfType<Position>().Select(m => new { Text = m.ToString(), Value = (int)m }).ToList();
}
@Html.DropDownListFor(model => model.EmployeePositions.DepID, new SelectList(positionList, "Value", "Text"), new { @class = "form-control1 select2 ", style = "width:100 %;" })
</div>
<div class="form-group">
<label>نام کاربری</label>
@Html.TextBoxFor(model => model.UserInfos.Usr_UserName, new { @class = "form-control1", placeholder = "نام کاربری" })
</div>
</div>
<div class="form-group">
<label>کلمه عبور</label>
@Html.TextBoxFor(model => model.UserInfos.Usr_Password, new { @class = "form-control1", placeholder = "کلمه عبور" })
</div>
<div class="form-group">
<label>تکرار کلمه عبور</label>
@Html.TextBoxFor(model => model.UserInfos.ComparePassword, new { @class = "form-control1", placeholder = "تکرار کلمه عبور" })
</div>
<button type="submit" style="width:60%; margin-left:70px; margin-top:20px;">ذخیره</button>

</div>
}


این اسکریپت هم برای لود صفحه به صورت ایجکس (از پلاگین استفاده کردم، برای همه صفحات استفاده کردم جواب داده)

<script>
$(function () {
$('#UpdateForm').ajaxForm();
});
</script>

mr.sirwan
سه شنبه 28 آذر 1396, 18:58 عصر
شما به جای فرم اچ تی ام الی از نوع Ajax استفاده کنین ببینین مشکل رفع میشه:
@using (Ajax.BeginForm("UpdateUsers", "Admin", FormMethod.Post, new { id = "UpdateForm" }))

leilast
سه شنبه 28 آذر 1396, 23:29 عصر
پلاگین ایجکس رو حذف کردم . هم به فرمی ajax.beginform و هم به فرم html.beginform نوشتم.
(خاصیت AjaxOnly رو هم برداشتم چون اون فقط مربوط به پلاگینه)
اما خطای ۴۰۴ میده و آدرس رو نمیتونه پیدا کنه!!
هم متدهای اکشن ها فرق دارن و هم ورودی هاشون. پس چرا پیدا نمیکنه صفحه رو؟

leilast
چهارشنبه 29 آذر 1396, 09:45 صبح
ببینید اشکال اینجاست.
من id رو به عنوان ورودی برای متد Get درنظر گرفتم. اینجا URL برای کاربری با ای دی مشخص (مثلا۹) میشه" Admin/UpdateUsers/9"

اما وقتی میره برای متدPost آدرس صفحه همچنان همین آدرس با URL هست. یعنی آی دی همچنان باقی هست. در حالی که متدPost با Entity فراخوانی میشه نه ای دی.
پیغامش هم همینه:
۹/Requested URL: /Admin/UpdateUsers/


الان باید کاری کنم که که این تغییر آدرس انجام بشه.