أفضل طريقة لتنفيذ حفظ | حفظ وإغلاق | إلغاء إجراءات النموذج في ASP.NET MVC 3 RC

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

  •  27-09-2019
  •  | 
  •  

سؤال

أنا أتساءل كيف يمكنك أن تتم تنفيذ إجراءات النماذج المتعددة عند إرسال نموذج في ASP.NET MVC 3 RC.

إذا قمت بتحرير مستخدم ، على سبيل المثال ، أود الحصول على شريط إجراء مع الأزرار التالية ؛

"حفظ" | "حفظ وإغلاق" | "يلغي"

حفظ - يقدم النموذج ويحفظ ، وإعادتك إلى شاشة التحرير. يمكن تنفيذها بسهولة كزر إدخال/إرسال قياسي. لا شيء مميز هنا.

قد يبدو رمز وحدة التحكم لهذا

public ActionResult Edit(UserViewModel model)
{
  ...
  return RedirectToAction("Edit", model.Id");
}

إلغاء - فقط إرجاعك إلى الشاشة السابقة. كنت أفكر في استخدام علامة مرساة لهذا الغرض.

<a href="@Request.UrlReferrer" class="button">Cancel</a>

لكنني متعثر على كيفية التنفيذ "حفظ وإغلاق" عندما تحتاج إلى إرسال نفس بيانات النموذج. كنت أتساءل عن وجود بارام قرب لا البولوم ربما؟

public ActionResult Edit(UserViewModel model, bool? close)
{
  ...
  return  close.GetValueOrDefault(false) ? RedirectToAction("Index", model.Id" : RedirectToAction("Edit", model.Id");
}

ولكن كيف يمكنني تقديم هذا المعامل الإضافي مع النموذج في هذه الحالة؟

إذا كان ذلك ممكنًا ، أرغب في الحصول على إجراء واحد للتعامل مع الإرسال كما في النموذج النامي أعلاه.

أنا مهتم أيضًا إذا كان أي شخص آخر قد توصل إلى نموذج تفاعل مستخدم لطيف حول هذه الفكرة.

المحلول

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

public ActionResult Edit(UserViewModel model, FormAction actionType)
{
  // pre-check
  if (actionType == FormAction.Cancel)
     // just return user to previous view and don't save.

  // Save code

  if (actionType == FormAction.Save)
     return ...
  else if (actionType == FormAction.SaveAndClose)
     ....
}

لأنني أردت نص "حفظ وإغلاق" ودود على <input> زر ولكن أراد استخدام التعداد الذي قمت بتطبيق نموذج مخصص للتشكيل الذي قام بالتحليل.

لم أستخدم أ <button> علامة لأن Theming كان بالفعل في مكانه <input> العلامات.

هل كانت مفيدة؟

المحلول

يمكنك الحصول على أزرار إرسال متعددة في نموذج مع نفس name سمة ولكن مختلفة value صفات. أي زر يتم النقر عليه على الإطلاق ، المرتبطة value سيتم نشرها على الخادم.

يمكنك استخدام رابط بسيط ل Cancel لكنني سأدرجها كزر على أي حال.

<input type="submit" name="actionType" value="Save" />
<input type="submit" name="actionType" value="Save and Close" />
<input type="submit" name="actionType" value="Cancel" />

وفي عملك ، اختبر القيم.

public ActionResult Edit(string actionType)
{
    if(actionType == "Save")
    {
        // Save action
    }
    else if (actionType == "Save and Close")
    {
        // Save and quit action
    }
    else
    {
        // Cancel action
    }
}

إذا كنت لا تحب وجود النص الطويل في value السمة ، يمكنك استخدام HTML القياسية <button> العلامة التي تتيح لك تحديد قيمة منفصلة ونص منفصل.

نصائح أخرى

الاقتراح من قبل omar رائع. إليكم كيف جعلت هذا أكثر عامة في الحالة التي أردت فيها تأكيدًا عندما يُطلب من المستخدم حذف كائن. ملحوظة! في httppost أقوم بسحب الكائن مرة أخرى بدلاً من استخدام العنصر الذي تم تمريره إلى الطريقة. يمكنك تقليل مكالمة DB من خلال وجود طريقة عرض تحتوي على جميع الخصائص بحيث يتم ملء "العنصر".

هذا هو نموذج العرض

public class DeleteViewModel<T> {
    public string ActionType { get; set; }
    public T Item { get; set; }
}

مراقب

    public ActionResult Delete(int id) {
        DeleteViewModel<Category> model = new DeleteViewModel<Category>() {
            Item = categoryRepository.Categories.FirstOrDefault(x => x.CategoryID == id)
        };
        return View(model);
    }

    [HttpPost]
    public ActionResult Delete(DeleteViewModel<Category> model) {
        if (model.ActionType == "Cancel")
            return RedirectToAction("Index");
        else if (model.ActionType == "Delete") {
            var cat = categoryRepository.Categories.FirstOrDefault(x => x.CategoryID == model.Item.CategoryID);
            categoryRepository.Delete(cat);
            return RedirectToAction("Index");
        }        
        //Unknown Action
        return RedirectToAction("Index");
    }

رأي

    <div class="actions">
        <div class="actions-left"><input type="submit" value="Cancel" name="ActionType"/></div>
        <div class="actions-right"><input type="submit" value="Delete" name="ActionType" /></div>
    </div>   
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top