سؤال

ولدي مشكلة الزرع حتى في شكل أحاول نشر. في سيناريو حيث لا تتحقق النموذج، وأنا أخذ الطريق القياسية الدعوة ModelState.AddModelError() ثم العودة نتيجة عرض.

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

وقانون العمل بلدي تقريبا:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult EditDataDefinition(long? id, string name)
{
    var dataDefinition = ...

    // do some validation stuff
    if (!ModelState.IsValid)
    {
        // manually set checkbox fields via ViewData seeing as this STILL doesn't work in MC 1.0 :P
        // ...
        return View(dataDefinition);
    }

}

والآن، dataDefinition (وهو LINQ إلى كيان SQL) يحتوي على حقل <م> MinVolume ، يتم التعامل في الرأي هذا السطر:

Minimum: <%= Html.TextBox("MinVolume", null, new { size = 5 })%>

ولكن عندما يتم تقديم عرض بعد التحقق من صحة ModelState فشلت، لا يتم حفظ القيمة المكتوبة في ذلك على الصفحة الأصلية نشرنا ما لم تدرجه كمعلمة في طريقة إعادة النشر. حرفيا، ويمكنني أن "حل المشكلة" من خلال ذلك:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult EditDataDefinition(long? id, string name, string minVolume)

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

وأي أفكار؟

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

المحلول

ويمكن أن يكون هذا الرمز الخاص بك:

<%= Html.TextBox("MinVolume", null, new { size = 5 })%>

و.. لديه null لالمعلمة القيمة الافتراضية؟ ربما إذا قمت بتغيير null إلى Model.MinVolume أنها سوف تستمر القيمة. مثل هذا:

<%= Html.TextBox("MinVolume", Model.MinVolume, new { size = 5 })%>

وأنا لست متأكدا مما اذا كان العمل الخاص بك إرجاع MinVolume القيمة في ثو نموذج. إذا كان الأمر كذلك، ينبغي أن يعمل فوق. آخر، قد تحتاج إلى إعادة العمل قليلا.

نصائح أخرى

ويا رجل لقد تحسنت فقط تصميمي التطبيق. وتحدث هذه المشكلة لأن لديك التحقق من صحة مخصصة (لدي أيضا). لديك لإضافة بعد

ModelState.AddModelError()

وهذا

ModelState.SetModelValue("MinVolume", ValueProvider["MinVolume"]);

في الرأي يجب أن يكون

Mimum:<%=Html.Textbox("MinVolume")%>

لا يزال غير متأكد من السبب في أنها تعمل ولكن لأنها عملت لي.

ما هو المفتاح الذي تستخدمه عند تعيين قيمة في ModelState على خطأ؟ التعليمات البرمجية التي تحدد المعلمة قيمة مربع نص يشبه:

وجزء ذات الصلة من كود إطار .

string attemptedValue = (string)htmlHelper.GetModelStateValue(name, typeof(string));
tagBuilder.MergeAttribute("value", attemptedValue ?? ((useViewData) ? htmlHelper.EvalString(name) : valueParameter), isExplicitValue);

وكما ترون في حالة وجود قيمة المحاولة، فإنه سيتم استخدام ذلك - ولكن فقط إذا كان نفس المفتاح هو متاح

.

وأنا أعلم أن هذا يعمل لأن لدي عمل لا يأخذ المعلمات ويحصل على القيم مباشرة من ValueProvider ويستخدم AddModelError للإشارة إلى أخطاء التحقق من الصحة. أنا متأكد من أن يتم الاحتفاظ القيم في مربعات النص بلدي.

تعديل : لمن أجل القيم التي يتم الاحتفاظ، فإنها تحتاج إلى أن تكون مرتبطة مع نموذج بطريقة أو بأخرى. طريقة واحدة للقيام بذلك هي لإضافتها إلى قائمة المعلمة. وهناك طريقة أخرى لاستخدام UpdateModel (مع أسماء المعلمات في القائمة البيضاء أو أي القائمة البيضاء). وهناك طريقة ثالثة لإضافة المعلمة صراحة إلى نموذج كما هو الحال في الجواب @ جينيا ل. منذ المساعد تسحب فقط من دولة نموذجية، يجب أن تكون هناك لالقيم المراد الاحتفاظ بها. فإنه لا ينظر إلى الملكية نموذج طلب ل.

وكما فهمت الحل هو:

[Transaction]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult EditDataDefinition(int id, FormCollection form)
{
    T itemToUpdate = repository.Get(id);
    UpdateModel(itemToUpdate, form.ToValueProvider());

    if (itemToUpdate.IsValid())
    {
        repository.SaveOrUpdate(itemToUpdate);
        return Json(ValidationResultToJson(itemToUpdate.ValidationResults()));
    }

    repository.DbContext.RollbackTransaction();
    return Json(ValidationResultToJson(itemToUpdate.ValidationResults()));
}

وحظا سعيدا!

وحل آخر إذا كتبت في ضوء:

<%var minVolume=Request["MinVolume"]??"";%>
<%=Html.Textbox("MinVolume",minVolume,new {size=5})%>

يرجى الرجوع إلى هذه المقالة لمعرفة طرق مختلفة للتعامل مع إعادة النشر في ASP.NET MVC

نص الارتباط

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