عندما تنشر رأيي نموذجا مرة أخرى إلى الإجراء الخاص بي، كيف يمكنني حفظه مرة أخرى إلى قاعدة البيانات التي جاء منها؟
-
19-09-2019 - |
سؤال
أنا نوع من الخلط ...
لدي عمل واحد يأخذ معرف، وتحميل كائن، ويمرره إلى العرض الذي يرتبط بنوع نوع هذا الكائن.
بعد تحرير البيانات الموجودة في النموذج المرفقة عن طريق العرض، أعود إلى إجراء آخر يقبل كائنا بنفس النوع بالضبط كنموذج.
ومع ذلك، في هذه المرحلة، لا يمكنني فقط استدعاء المستودع. كما أعتقد، أعتقد أن لدي كائن جديد تماما، لم يعد مرتبطا بالآخر من استعلام قاعدة البيانات الأصلية التي تم إرسالها إلى العرض.
إذا كيف يمكنني تحديث الكائن المستحسن سابقا وحفظ التغييرات في DB بدلا من الحصول على كائن جديد مرة أخرى من العرض؟
حاولت حتى الحصول على مثيل جديد للكائن من DB وتعيين كائن عرض إرجاع إليه، ثم Repo.Save ()، لا يزال أي حظ من هذا القبيل.
ماذا أفعل الخطأ هنا؟
رمز تحكم:
[Authorize]
public ActionResult EditCompany(int id)
{
//If user is not in Sys Admins table, don't let them proceed
if (!userRepository.IsUserSystemAdmin(user.UserID))
{
return View("NotAuthorized");
}
Company editThisCompany = companyRepository.getCompanyByID(id);
if (editThisCompany == null)
{
RedirectToAction("Companies", new { id = 1 });
}
if (TempData["Notify"] != null)
{
ViewData["Notify"] = TempData["Notify"];
}
return View(editThisCompany);
}
//
// POST: /System/EditCompany
[Authorize]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult EditCompany(Company company)
{
string errorResponse = "";
if (!isCompanyValid(company, ref errorResponse))
{
TempData["Notify"] = errorResponse;
return RedirectToAction("EditCompany", new { id = company.CompanyID });
}
else
{
Company updateCompany = companyRepository.getCompanyByID(company.CompanyID);
updateCompany = company;
companyRepository.Save();
return RedirectToAction("EditCompany", new { id = company.CompanyID });
}
return RedirectToAction("Companies", new { id = 1 });
}
المحلول
حاول استخدام TryUpdateModel
طريقة. بهذه الطريقة يمكنك الحصول على الشركة من المستودع قبل أن تنبع البيانات إليها.
[Authorize]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult EditCompany(int id, FormCollection form)
{
//Default to a new company
var company = new Company();
//If we have an id, we must be editing a company so get it from the repo
if (id > 0)
company = companyRepository.getCompanyByID(id);
//Update the company with the values from post
if (TryUpdateModel(company, form.ToValueProvider()))
{
string errorResponse = "";
if (!isCompanyValid(company, ref errorResponse))
{
TempData["Notify"] = errorResponse;
return RedirectToAction("EditCompany", new { id = company.CompanyID });
}
else
{
companyRepository.Save();
return RedirectToAction("EditCompany", new { id = company.CompanyID });
}
}
return RedirectToAction("Companies", new { id = 1 });
}
hths،
تشارلز
ملاحظة. بشكل عام، إنها فكرة سيئة أن تنبع البيانات إلى نماذج النطاق الخاصة بك ... استخدم نماذج العرض التقديمي بدلا من ذلك، ثم يمكنك التغلب على هذه المشكلة بأكملها.