سؤال

لدي نموذج في تطبيق MVC الخاص بي، في النظرية، يجب إرسال البيانات إلى قاعدة البيانات الخاصة بي باستخدام فئة مستودع.

ومع ذلك، عندما أقدم النموذج (http: // localhost: 1028 / admin / newuser /)، يتغير عنوان URL إلى حيث يجب تقديم النموذج إليه، وهو أمر جيد (http: // localhost: 1028 / admin / newuser / إرسال)، ولكن بمجرد إرسالها، يجب أن ترسل المستخدم إلى صفحة تأكيد.

من ما يمكنني قوله، أنا أتحرك من خلال جميع صفحاتي بشكل صحيح حتى يأتي إلى الإرسال، حيث يعرض النموذج مرة أخرى ولكن تحت / admin / newuser / إرسال ولم يتم إدخال البيانات في قاعدة البيانات.

هذا هو ActionResulst أنا أستخدم:

Public Function Submit() As ActionResult
         Try
            Dim user = New hdUser() With { _
                .userLogon = Request.Form("UserLogin"), _
                .userPass = Request.Form("UserPassword"), _
                .userEmail = Request.Form("UserEmail"), _
                .RealName = Request.Form("UserFullName"), _
                .isLive = 1, _
                .avatar = "noavatar.gif" _
             }
            userRepository.Add(user)
            userRepository.Save()

            Return Redirect("/Admin/NewUser/Confirm")
        Catch ex As Exception
            ModelState.AddModelError("Error", ex)
        End Try
        Return View()
    End Function

أنا جديد إلى حد ما بالنسبة إلى MVC لذلك أنا غير متأكد تماما مما إذا كان أعلاه صحيح أم لا.

وفي فئة مستودع بياناتي Userrepository.vb., ، الوظائف التي أستخدمها هي:

Public Sub Add(ByVal user As hdUser) Implements IUserRepository.Add
            db.hdUsers.InsertOnSubmit(user)
        End Sub

و

Public Sub Save() Implements IUserRepository.Save
            db.SubmitChanges()
        End Sub

والنموذج الذي أنشأته هو:

<form action="/Admin/NewUser/Submit" method="post">
                <table border="0" cellpadding="0" cellspacing="2">
                    <tr>
                        <td><strong>User's Full Name</strong> <br />
                         <%=Html.TextBox("UserFullName")%>
                            </td>
                    </tr>
                    <tr>
                        <td><strong>User Login</strong> <br />
                         <%=Html.TextBox("UserLogin")%>
                            </td>
                    </tr>
                    <tr>
                        <td><strong>Password</strong> <br />
                         <%=Html.Password("UserPassword")%>
                           </td>
                    </tr>
                    <tr>
                        <td><strong>Email Address</strong> <br />
                         <%=Html.TextBox("UserEmail")%>
                         </td>
                    </tr>
                    <tr>
                        <td align="right"><input type="submit" value="Create" /></td>
                    </tr>
                </table>
        </form>

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

قد يكون من الواضح لشخص ما أكثر خبرة، لكنني ليس لدي فكرة عن هذا واحد.

هل هذا التعليمات البرمجية التي تسبب المشكلة أو خطأ آخر؟

شكرا مقدما على أي مساعدة.


تعديل: بناء على تعليق Zhaph - Ben Duguid، قمت بإجراء التعديلات التالية:

jamincontroller.vb.

<AcceptVerbs(HttpVerbs.Post)> _
    Public Function NewUser(ByVal formValues As FormCollection) As ActionResult
        Try
            Dim user = New hdUser()
            user.userLogon = Request.Form("UserLogin")
            user.userPass = Request.Form("UserPassword")
            user.userEmail = Request.Form("UserEmail")
            user.RealName = Request.Form("UserFullName")
            user.isLive = 1
            user.avatar = "noavatar.gif"
            UpdateModel(user)
            userRepository.Add(user)
            userRepository.Save()
        Catch ex As Exception
            ModelState.AddModelError("Error", ex)
        End Try
        Return View()
    End Function

newuser.aspx.

<%Html.BeginForm()%>
            <%=Html.ValidationMessage("Error")%>
                  <table border="0" cellpadding="0" cellspacing="2">
                    <tr>
                        <td><strong>User's Full Name</strong> <br />
                         <%=Html.TextBox("UserFullName")%>
                            <%=Html.ValidationMessage("Name", "*")%></td>
                    </tr>
                    <tr>
                        <td><strong>User Login</strong> <br />
                         <%=Html.TextBox("UserLogin")%>
                            <%=Html.ValidationMessage("Username", "*")%></td>
                    </tr>
                    <tr>
                        <td><strong>Password</strong> <br />
                         <%=Html.Password("UserPassword")%>
                            <%=Html.ValidationMessage("Password", "*")%></td>
                    </tr>
                    <tr>
                        <td><strong>Email Address</strong> <br />
                         <%=Html.TextBox("UserEmail")%>
                         <%=Html.ValidationMessage("Email", "*")%></td>
                    </tr>
                    <tr>
                        <td align="right"><input type="submit" value="Create" /></td>
                    </tr>
                </table>
                <% Html.EndForm() %>

التي تنتج الآن خطأ القيمة "'غير صالحة. لي.

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


تعديل: لقد صنعت تلك التعديلات استجابة Zhaph - Ben Duguid Edit، لقد قمت بتغيير عناصر النموذج إلى أسماء حقل DB (لاختبار على الأقل). والآن، عند تقديم الصفحة، يتم ملء اسم الدخول والبريد الإلكتروني، كلمة المرور فارغة (التي افترض أنها سلوك من المتوقع حسب مربعات كلمة المرور) ولكن ما زلت أتلقى "القيمة" غير صالحة " خطأ.

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

المحلول

Response.Write في وحدة التحكم الخاصة بك لن تفعل أي شيء للعرض.

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

ModelState.AddModelError();

هناك مثال جيد جدا على كيفية تنفيذ نمط مستودع، والاستفادة من ميزات ملزمة نموذج ASP.NET MVC، إلخ في الفصل nerddinner. من كتاب ASP.NET MVC الاحترافي.

وحدة تحكم مثال لدي (في C # أخشى) بناء على عينات عشاء NERD:

//
// POST: /AdminAlbums/Create

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(FormCollection collection)
{
  var album = new Album();

  // Method on System.Web.Mvc.Controller, that takes a form collection, and
  // using reflection on the Model, assigns values to it from the form.
  UpdateModel(album);

  if (album.IsValid)
  {
    // These methods are the same as yours
    m_PhotoRepository.Add(album);
    m_PhotoRepository.Save();

    // In this instance, I'm returning the user to a list view of Albums
    // for editing, probably ought to send them to the page to start 
    // uploading photos.
    return RedirectToAction("Index");
  }

  // Still here, so I'm going to set up some ViewData I need.
  ViewData["Title"] = "Create a new album";
  ViewData["Message"] = "Create Album";

  // I'm picking up errors from the model here.
  // RuleViolation is my own class, implemented in a partial on Album.
  foreach (RuleViolation violation in album.GetRuleViolations())
  {
    ModelState.AddModelError(violation.PropertyName, violation.ErrorMessage);
  }

  return View(album);
}

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

الجزء ذو الصلة من الرأي هو:

<%= Html.ValidationSummary("Edit was unsuccessful. Please correct the errors and try again.") %>
<% using (Html.BeginForm()) {%>
  <fieldset>
    <legend>Album details</legend>
    <div class="form_row">
      <label for="Caption" class="left_label">Album caption:</label>
      <%= Html.TextBox("Caption", Model.Caption, new { @class = "textbox" })%>
      <%= Html.ValidationMessage("Caption", "*") %>
      <div class="cleaner">&nbsp;</div>
    </div>
    <div class="form_row">
      <label for="IsPublic" class="left_label">Is this album public:</label>
      <%= Html.CheckBox("IsPublic", Model.IsPublic) %>
    </div>
    <div class="form_row">
      <input type="submit" value="Save" />
    </div>
  </fieldset>
<% } %>

تحرير استجابة لاستكشاف تحرير

آسف، يجب أن أكون قد أوضحت:

يعتمد الكثير من هذا على استخدام أساليب المساعد التي يوفرها إطار ASP.NET MVC - ستلاحظ أنني أستخدم أساليب مثل Html.TextBox لتوليد مجالاتي، يتم سحب اسمها / معرفها من النموذج نفسه. بهذه الطريقة، إذا قمت بتحميل العرض باستخدام ManifyErrors في ModelState، سيضيف المساعد التفاصيل ذات الصلة إلى HTML المقدمة لتضمين العلامة التالية

<label for="Caption" class="left_label">Caption:</label>
<input class="input-validation-error textbox" 
       id="Caption" name="Caption" type="text" value="" />
<span class="field-validation-error">*</span>

الخيار الآخر الذي يمكن أن يكون لديك هو إضافة رسالة إلى ViewData جمع، وإذا كان لها قيمة، عرض ذلك على وجهة نظرك.


تحرير استجابة لاستكشاف تحرير

بضعة أشياء يجب أن تؤخذ في الاعتبار:

1) يجب أن تكون المعرفات الخاصة بعناصر النماذج وضوابط التحقق من الصحة هي هي نفسها:

<%= Html.TextBox("Caption", Model.Caption, new { @class = "textbox" })%>
<%= Html.ValidationMessage("Caption", "*") %>

(لديك أشياء مثل "useremail" و "البريد الإلكتروني")

2) يجب أن تعيد HDUSER إلى طريقة العرض عن طريق الخطأ - لذلك جرب شيئا مثل هذا:

<AcceptVerbs(HttpVerbs.Post)> _
Public Function NewUser(ByVal formValues As FormCollection) As ActionResult
  Dim user = New hdUser()
  Try
    UpdateModel(user)
    user.isLive = 1
    user.avatar = "noavatar.gif"

    userRepository.Add(user)
    userRepository.Save()
  Catch ex As Exception
      ModelState.AddModelError("Error", ex)
  End Try
  Return View(user)
End Function
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top