عندما تنشر رأيي نموذجا مرة أخرى إلى الإجراء الخاص بي، كيف يمكنني حفظه مرة أخرى إلى قاعدة البيانات التي جاء منها؟

StackOverflow https://stackoverflow.com/questions/2231892

  •  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،
تشارلز

ملاحظة. بشكل عام، إنها فكرة سيئة أن تنبع البيانات إلى نماذج النطاق الخاصة بك ... استخدم نماذج العرض التقديمي بدلا من ذلك، ثم يمكنك التغلب على هذه المشكلة بأكملها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top