ASP.NET MVC - شكل إرجاع Null إلا نموذج نموذج ملفوفة في العرف ViewModel

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

سؤال

لدي زوج من وجهات النظر في طلبي هذا كل عرض نفس محرر قالب واحد من بلدي نموذج البنود ؛ من وجهات النظر ("إضافة" و "تحرير") ، "تحرير" يعمل بشكل جيد, ولكن "إضافة" تعود فارغة لنموذج عندما تحكم العمل يعالج بعد.

وجدت أنه إذا أعطي "إضافة" عرض مخصص ViewModel و الاتصال Html.EditorFor(p => p.PageContent) بدلا من مجرد استدعاء EditorFor() على العموم نموذج كائن- Html.EditorFor(p => p), ثم شكل عوائد الصحيح غير فارغة النموذج ، ولكن الذي يولد مشاكل أخرى تتعلق بلدي البرمجة النصية من جانب العميل والتحكم معرفات (كما هو الحال الآن جميع المجالات مسبوقة بـ "PageContent_").أنا باستخدام نفس محرر قالب التقنية في بضعة أماكن مختلفة في جميع أنحاء بلدي التطبيق و لا أحد من الآخرين واظهار هذا الغريب الاعتماد على ViewModel.

وقد أي شخص آخر من أي وقت مضى واجهت مشاكل مماثلة ؟

تحرير رأي

<%@ Page Title="" Language="C#" MasterPageFile="~/Areas/Admin/Views/Shared/Site.Master"
Inherits="System.Web.Mvc.ViewPage<PageContent>" %>

<% using (Html.BeginForm())
   { %>
<%=Html.Hidden("PageID", Model.Page.ID) %>
<%=Html.EditorFor(p => p)%>
<input type="submit" name="btnSave" value="Save" />
<input type="submit" name="btnCancel" value="Cancel" class="cancel" />
<% }

العمل (العامل)

[HttpPost, ValidateInput(false)]
public ActionResult EditContent(int id, FormCollection formCollection) {}

إضافة عرض

<%@ Page Title="" Language="C#" MasterPageFile="~/Areas/Admin/Views/Shared/Site.Master"
Inherits="System.Web.Mvc.ViewPage<PageContent>" %>

<% using (Html.BeginForm())
   { %>
<%=Html.Hidden("PageID", ViewData["PageID"]) %>
<%=Html.EditorFor(p => p)%>
<input type="submit" name="btnSave" value="Save" />
<input type="submit" name="btnCancel" value="Cancel" class="cancel" />
<% } %>

العمل (الفشل)

// content is ALWAYS null
[HttpPost, ValidateInput(false)]
public ActionResult AddContent(PageContent content, FormCollection formCollection) {}

قبل أن تبكي "مكررة"

هذا السؤال لا تتصل هذا واحد, لكن هذا السؤال تستهدف المشكلة المحددة أنا تشهد بدلا من أعم السؤال هناك.

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

المحلول

لقد تتبعت المشكلة انها مثيرة للاهتمام بدلا واحدة.

عندما DefaultModelBinder محاولات لحل نموذج عنصر واحد من أول الأشياء التي لا تحقق لمعرفة ما إذا كان هناك أي إشكال الحقول في البيانات ملزمة ؛ وذلك من خلال التحقق من وجود أي شكل من البنود التي تبدأ مع اسم نموذج كائن (هذا يبدو للغاية التعسفي, إذا كنت تسأل لي).إذا أي "مسبوقة" تم العثور على حقول ثم النتائج في مختلف ملزمة منطق الاستشهاد به.

ASP.NET MVC 2 معاينة 2 BindModel() المصدر

public virtual object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) {
    if (bindingContext == null) {
        throw new ArgumentNullException("bindingContext");
    }
    bool performedFallback = false;
    if (!String.IsNullOrEmpty(bindingContext.ModelName) && !DictionaryHelpers.DoesAnyKeyHavePrefix(bindingContext.ValueProvider, bindingContext.ModelName)) {
        // We couldn't find any entry that began with the prefix. If this is the top-level element, fall back
        // to the empty prefix.
        if (bindingContext.FallbackToEmptyPrefix) {
             /* omitted for brevity */
            };
            performedFallback = true;
        }
        else {
            return null;
        }
    }

    // Simple model = int, string, etc.; determined by calling TypeConverter.CanConvertFrom(typeof(string))
    // or by seeing if a value in the request exactly matches the name of the model we're binding.
    // Complex type = everything else.
    if (!performedFallback) {
       /* omitted for brevity */
    }
    if (!bindingContext.ModelMetadata.IsComplexType) {
        return null;
    }
    return BindComplexModel(controllerContext, bindingContext);
}

تحكم العمل تعريف للتعامل مع إضافة العمل يحدد PageContent عنصر يسمى "المحتوى" في المجال PageContent لديه خاصية تسمى "المحتوى" الذي "يقابل" مع نموذج باسم "المحتوى" مما تسبب في DefaultModelBinder أن نفترض أن لدي مسبوقة قيمة عندما تكون في واقع الأمر كان مجرد عضو PageContent.عن طريق تغيير التوقيع

من:

[HttpPost, ValidateInput(false)]
public ActionResult AddContent(PageContent content, FormCollection formCollection) {}

إلى:

[HttpPost, ValidateInput(false)]
public ActionResult AddContent(PageContent pageContent, FormCollection formCollection) {}

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

يبدو لي أن هذه المسألة تقع قريبة جدا من "علة" الوضع.فمن المنطقي أن رأيي عملت في البداية مع ViewModel لأن "المحتوى" كان الحصول على مسبوقة بـ "PageContent_" ، ولكن الإطار الأساسي ميزة/علة مثل هذا لا يجب أن تعالج IMHO.

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