ASP.NET MVC 2 معاينة 1 - التحقق من صحة DataAnnotation مع كائن النموذج المعقد

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

سؤال

دفعتني القدرة على السماح للنموذج بالتعامل مع التحقق من الصحة الخاصة به إلى البدء في اللعب مع إصدار معاينة MVC 2. حتى الآن ، أحب بساطة مخطط التحقق من الصحة. ومع ذلك ، لقد واجهت حاجزًا. يعمل نمط التحقق من الصحة هذا بشكل جيد لكائنات طراز العرض البسيطة. على سبيل المثال إذا كان لدي كائن نموذج يسمى السيارات وأنا أتطلع إلى إنشاء عرض لإنشاء سيارة جديدة:

-----نموذج-------

public class Car
{
    public string Id { get; set; }
    public string Name { get; set; }
    public string Color { get; set; }
}

-----مراقب---------

public class CarController : Controller
{
    public ActionResult Create()
    {
        Car myCar = new Car();
        return View("Create", myCar);

    }

    [HttpPost]
    public ActionResult Create(Car myCar)
    {
        if (!ModelState.IsValid)
        {
            return View("Create", myCar);
        }

        //Do something on success
        return View("Index");

    }

}

-------رأي--------------

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

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

    <%= Html.ValidationSummary("Edit was unsuccessful. Please correct the errors and try again.") %>

    <% 
        using (Html.BeginForm()) {%>

        <fieldset>
            <legend>Edit User Profile</legend>
            <p>
                <label for="Id">Id:</label>
                <%= Html.TextBox("Id", Model.Id)%>
                <%= Html.ValidationMessage("Id") %>
            </p>
            <p>
                <label for="Name">Name:</label>
                <%= Html.TextBox("Name", Model.Name)%>
                <%= Html.ValidationMessage("Name") %>
            </p>
            <p>
                <label for="Color">Color:</label>
                <%= Html.TextBox("Color", Model.Color)%>
                <%= Html.ValidationMessage("Color") %>
            </p>

            <p>
                <input type="submit" value="Save" />
            </p>
        </fieldset>

    <% } %>

</asp:Content>

هذا يعمل مثل السحر. ولكن ليس كل آرائي ، أو كائنات النموذج لهذه المسألة ، بسيطة. قد يكون لدي كائن طراز سيارة مثل:

-----نموذج-------

public class PaintScheme
{
    public int Red { get; set; }
    public int Blue { get; set; }
    public int Green { get; set; }
}

public class Car
{
    public string Id { get; set; }
    public string Name { get; set; }
    public PaintScheme Paint{ get; set; }
}

-------رأي--------------

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

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

    <%= Html.ValidationSummary("Edit was unsuccessful. Please correct the errors and try again.") %>

    <% 
        using (Html.BeginForm()) {%>

        <fieldset>
            <legend>Edit User Profile</legend>
            <p>
                <label for="Id">Id:</label>
                <%= Html.TextBox("Id", Model.Id)%>
                <%= Html.ValidationMessage("Id") %>
            </p>
            <p>
                <label for="Name">Name:</label>
                <%= Html.TextBox("Name", Model.Name)%>
                <%= Html.ValidationMessage("Name") %>
            </p>
            <p>
                <label for="Red">Color Red:</label>
                <%= Html.TextBox("Red", Model.Paint.Red)%>
                <%= Html.ValidationMessage("Red") %>
            </p>
            <p>
                <label for="Blue">Color Blue:</label>
                <%= Html.TextBox("Blue", Model.Paint.Blue)%>
                <%= Html.ValidationMessage("Blue") %>
            </p>
            <p>
                <label for="Green">Color Green:</label>
                <%= Html.TextBox("Green", Model.Paint.Green)%>
                <%= Html.ValidationMessage("Green") %>
            </p>

            <p>
                <input type="submit" value="Save" />
            </p>
        </fieldset>

    <% } %>

</asp:Content>

عندما أضيف Paintscheme خصائص في رأيي ، لا يتم نقلها باستخدام كائن "mycar" الذي تم تمريره في إجراء وحدة التحكم الخاصة بي. هل هناك طريقة لحل هذا دون الحاجة إلى إعادة بناء الكائن من مجموعة النماذج ثم التحقق من طراز الموديل؟

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

المحلول

  1. يجب أن يكون لديك الضابط العام للحصول على خصائص تريد أن تكون ملزمة. أتساءل كيف تعمل العينة الأولى لك لأن كل شيء خاص.
  2. عليك أن انشر قيمة واحدة على الأقل من خاصية PaintsCheme لتكون قادرة على ربطها.
  3. يجب أن تكون جميع خصائص الأطفال مسبوقة بـ طريق لذلك. أين طريق يمكن تعريفها على أنها*(propertyName.) **.

يبدو أن النقطة 3 غير راضية في الرأي. قم بتغيير الجزء المناسب من العرض إلى هذا:

        <p>
            <label for="Red">Color Red:</label>
            <%= Html.TextBox("Paint.Red")%>
            <%= Html.ValidationMessage("Red") %>
        </p>
        <p>
            <label for="Blue">Color Blue:</label>
            <%= Html.TextBox("Paint.Blue")%>
            <%= Html.ValidationMessage("Blue") %>
        </p>
        <p>
            <label for="Green">Color Green:</label>
            <%= Html.TextBox("Paint.Green")%>
            <%= Html.ValidationMessage("Green") %>
        </p>

بالإضافة إلى ذلك ، لاحظ أنني أزلت قيمًا صريحة من مساعد مربع النص لتجنب NullReferenceException المحتمل.

نصائح أخرى

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

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

 <p>
                <label for="Red">Color:</label>
                <%= Html.TextBox("Red", Model.Paint.Red)%>
                <%= Html.ValidationMessage("Red") %>
 </p>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top